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。

我在这种情况下使用最多的解决方案是简化 if 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 回答