web-dev-qa-db-ja.com

ExtJS 4.2:コンテンツを表示するのに十分な幅がないツールヒント

ExtJS 4.2にアップグレードしてから、テキストフィールドにエラーがある場合に表示されるツールチップの幅がツールチップの内容を表示するのに十分ではないことに気づきました-それらは常に40px幅のようです。

問題を示すテストケースは次のとおりです。

<html>
<head>
    <title>Field error tooltips</title>
    <link rel="stylesheet" type="text/css" href="ext-4.2.0/resources/css/ext-all.css">
    <script type="text/javascript" src="ext-4.2.0/ext-all-debug.js"></script>
</head>
<body>
    <script type="text/javascript">
    Ext.onReady(function(){

        var form = Ext.create("Ext.form.Panel",{
            title: 'My form',
            width: 300,
            height: 100,
            items: [
                {xtype: 'textfield', name: 'FIELD1', fieldLabel: 'Field 1', allowBlank: false}
            ],
            renderTo: Ext.getBody()
        });
    });
    </script>
</body>
</html>

上記の例では、フィールドをクリックして、何も入力せずにフィールドの外側をクリックすると、空白にすることはできないことを示すツールチップが表示されます。ツールチップは、残念ながらメッセージを表示するのに十分な幅ではありません。他の誰かがこれに遭遇しましたか?

ありがとう!

30
user1578653

助けてくれてありがとう、でも私はsenchaフォーラムでうまくいくように見える解決策を見つけました:

http://www.sencha.com/forum/showthread.php?260106-Tooltips-on-forms-and-grid-are-not-resizing-to-the-size-of-the-text/ page3#24

具体的には、アプリの最初にある次のコード:

delete Ext.tip.Tip.prototype.minWidth;
27
user1578653

これはextjs 4.2のバグです。Firefox19では機能しますが、chrome 26では機能しません。

ツールチップのcssクラスをオーバーライドする必要があります。

.x-tip {
    width: auto !important;
}
.x-tip-body {
    width: auto !important;
}
.x-tip-body span {
    width: auto !important;
}
15
Eko Dedy

すみません、あまり役に立ちません。これは4.2.0の既知の問題であり、次のリリースで修正される可能性があります。参照: http://www.sencha.com/forum/showthread.php?257201

一時的な回避策として、チップコンテナーの動的なサイズ変更が必要ない場合は、CSSをオーバーライドするだけで済みます。

.x-tip-form-invalid, .x-tip-body-form-invalid {
    width: 150px !important;
}
4
James

Ext.tip.Tip.prototype.minWidthを削除しても、(IE10で)すべてのケースで問題が解決するわけではありません。

if(Ext.isIE10) { 
      Ext.supports.Direct2DBug = true;
}

ツールチップを修正しますが、他の奇妙な問題を引き起こします(ツールバーボタンのマージンが影響を受けることがあります!)。私が見た最高の解決策は:

Ext.override(Ext.tip.QuickTip, {
        helperElId: 'ext-quicktips-tip-helper',
        initComponent: function ()
        {
            var me = this;


            me.target = me.target || Ext.getDoc();
            me.targets = me.targets || {};
            me.callParent();


            // new stuff
            me.on('move', function ()
            {
                var offset = me.hasCls('x-tip-form-invalid') ? 35 : 12,
                    helperEl = Ext.fly(me.helperElId) || Ext.fly(
                        Ext.DomHelper.createDom({
                            tag: 'div',
                            id: me.helperElId,
                            style: {
                                position: 'absolute',
                                left: '-1000px',
                                top: '-1000px',
                                'font-size': '12px',
                                'font-family': 'tahoma, arial, verdana, sans-serif'
                            }
                        }, Ext.getBody())
                    );

                if (me.html && (me.html !== helperEl.getHTML() || me.getWidth() !== (helperEl.dom.clientWidth + offset)))
                {
                    helperEl.update(me.html);
                    me.setWidth(Ext.Number.constrain(helperEl.dom.clientWidth + offset, me.minWidth, me.maxWidth));
                }
            }, this);
        }
    });

これはIE9と10、ChromeとFirefoxで動作するようです。

3
user826840

それでも好奇心からこれを時々見ています...

4.1と4.2のソースをもう少し比較してみました。問題はどこかにある自動コンテナのレイアウトにあると思います。 4.1と4.2の間でTONのものが変更されました。これを確認できます。

うまくいけば、それは一部の人々のためにうまくいきます。

if(Ext.isIE10) { 
      Ext.supports.Direct2DBug = true;
  }

  if(Ext.isChrome) {
      Ext.define('Ext.layout.container.AutoTip', {
        alias: ['layout.autotip'],
        extend: 'Ext.layout.container.Container',

        childEls: [
            'clearEl'
        ],

        renderTpl: [
            '{%this.renderBody(out,values)%}',

            '<div id="{ownerId}-clearEl" class="', Ext.baseCSSPrefix, 'clear" role="presentation"></div>'
        ],

        calculate: function(ownerContext) {
            var me = this,
                containerSize;

            if (!ownerContext.hasDomProp('containerChildrenDone')) {
                me.done = false;
            } else {

                containerSize = me.getContainerSize(ownerContext);
                if (!containerSize.gotAll) {
                    me.done = false;
                }

                me.calculateContentSize(ownerContext);
            }
        }
    });

    Ext.override(Ext.tip.Tip, {
        layout: {
            type: 'autotip'
        }
    });
}

Ext.QuickTips.init();

あなたはより多くの詳細を見ることができます このフォーラムのトピックで

3
Sajib Hassan

別のソリューションは、QuickTipシングルトンに依存しない新しいQuickTipをフィールドレイアウトが作成するため(ドキュメントとは異なり)、QuickTipの最小幅をオーバーライドすることです。

Ext.override(Ext.tip.QuickTip,{
    minWidth: 200
});
0
Miisha

他のそれほど悪くない解決策は、このCSSを追加することでした:

.x-border-box .x-tip, .x-border-box .x-tip * {
  box-sizing: content-box;
}

ただし、ツールチップは少し大きすぎます。

Ext.tip.QuickTipをオーバーライドしてuser826840のソリューションを試します。

0
ovillemain