2

値だけを指定するのではなく、Extオブジェクトのカスタムプロパティ値(関数の条件に基づく)を作成しようとしています。

例1:

古いコード(動作中)

        this.buttons = [
            {
                text: 'Save',

ここに画像の説明を入力してください

新しいコード(機能していません)

        this.buttons = [
            {
                text: function() {
                    return 'Save X';
                },

ここに画像の説明を入力してください

例2:

古いコード(動作中)

                    }, {
                        width: 270,
                        labelAlign: 'right',
                        xtype: 'textfield',
                        name: 'user_id', 
                        fieldLabel: 'User ID',
                        hidden: true
                    }]

新しいコード(機能していません)

                    }, {
                        width: 270,
                        labelAlign: 'right',
                        xtype: 'textfield',
                        name: 'user_id', 
                        fieldLabel: 'User ID',
                        hidden: function() { return true; }
                    }]

例3:

条件に基づいて、テキストフィールドオブジェクト全体(レイジーインスタンス)を完全に無視します。

                    }, {
                        width: 270,
                        labelAlign: 'right',
                        xtype: 'textfield',
                        name: 'employee_number', 
                        fieldLabel: 'Employee Number'
                    }]
4

2 に答える 2

4

あなたは単にこのようにそれをすることはできません。タイプを関数に置き換えることはできません。あなたの場合、文字列と同じように、ブール値であると予想される変数に関数参照を割り当てます。

解決策A。

フィールドファクトリを自分で作成することを検討する必要があります。そのファクトリ内では、構成を割り当てる前に任意の機能を実行できます。(同じものを並べ替えてからBにしますが、関数呼び出しを減らすために使用できます)

解決策B。

関数参照自体を使用します。その後、これを実行する必要があります。(クラス拡張の要件をスペアし、その再利用可能を超えています)

 // The data store containing the list of states
var states = Ext.create('Ext.data.Store', {
    fields: ['abbr', 'name'],
    data : [
        {"abbr":"AL", "name":"Alabama"},
        {"abbr":"AK", "name":"Alaska"},
        {"abbr":"AZ", "name":"Arizona"}
        //...
    ]
});
Ext.namespace('my.util.helper');
my.util.helper.decideHide = function() { return true; }

// Create the combo box, attached to the states data store
Ext.create('Ext.container.Container', {
    renderTo: Ext.getBody(),
    items: [{
       xtype: 'combo',
       fieldLabel: 'Choose State',
       store: states,
       queryMode: 'local',
       displayField: 'name',
       valueField: 'abbr',
       test: my.util.helper.decideHide(),
       listeners: {
           afterrender: function(n) {
               alert(n.test);
           }
        }
    }]
});

ソリューションC。

そして、そのような場合に私が最も使用するソリューションは、elseステートメントの場合は単純化されます

// ... // more code
{
    text: myCondition ? 'Text A' : 'Text B',
    // more code
}
// ... // more code
于 2012-08-31T18:00:38.803 に答える
0

ええ、それは機能しません。一部のExt構成は評価される関数を取りますが、ほとんどは機能しません。匿名関数を作成して呼び出さない代わりに、次のようにします。

Ext.define('UserPanel', {
    extend : 'Ext.panel.Panel',
    initComponent : function() {

        this.items = [{
            xtype : 'button',
            text : this._getSaveButtonText()
        }, {
            width : 270,
            labelAlign : 'right',
            xtype : 'textfield',
            name : 'user_id',
            fieldLabel : 'User ID',
            hidden : this._isUserIdHidden()
        }]
        this.callParent();
    },

    _getSaveButtonText : function() {
        return 'Save';
    },

    _isUserIdHidden : function() {
        return true;
    }
});
于 2012-09-01T20:32:44.933 に答える