在提供的Ext.window.Window中设置禁止编辑该字段的权限

时间:2018-09-12 16:32:17

标签: javascript user-interface extjs

我需要禁止在Ext.window.Window中编辑文本字段,前提是下拉列表的值设置为“推迟”。

我正在尝试在filterCombo函数中执行以下操作:

var inp = this.up ('window'). down ('# MyTextField');

inp.disable ();

但是在控制台中出现错误: TypeError:this.up不是函数

我在做什么错? 下面是我的代码:

var store = Ext.create('Ext.data.Store', {
            fields: ['order', 'id', 'name'],
            storeId: 'DoubleBookStore',
            data : [
                {"id": 23, name: "New", order_install: 1},
                {"id": 24, name: "In Work", order_install: 2},
                {"id": 29, name: "Postponed", order_install: 3},
                {"id": 34, name: "Shipped", order_install: 4},
                {"id": 31, name: "In_transit", order_install: 5}
            ]
        });

function filterCombo(combobox, records) {
    if(records.data.name == 'Postponed'){
      var inp = this.up('window').down('#MyTextField');
      console.log(inp); 
      inp.disable();
    }
    index = records.data.order_install;
    store = combobox.getStore();
    store.clearFilter();

    store.filterBy(
                function(record) {
                    if ((record.internalId == index - 1) || (record.internalId == index) || (record.internalId == index + 1)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            );
};

var window = Ext.create('Ext.window.Window', {
    title: 'Приложение',
    width: 300,
    height: 200,
    items:[{
                xtype: 'combobox',
                fieldLabel: 'Status',
                name: 'status',
                store: store,
                valueField: 'id',
                displayField: 'name',
                typeAhead: true,
                queryMode: 'local',
                value: 24,
                listeners: {
                select : function(combo, records) {
                    filterCombo(combo, records);
                    }
                }

            },
            {
                        xtype: 'textfield',
                        fieldLabel: 'Ваше имя:',
                        itemId:'MyTextField',
                        name: 'name'
            }]
});
window.show();

3 个答案:

答案 0 :(得分:1)

您不能在select函数的范围之外使用“ this”,您已经将“ this”作为参数“ combobox”传递了,所以请像这样使用它:

function filterCombo(combobox, records) {

    var inp = combobox.up('window').down('#MyTextField');

    if(records.data.name == 'Postponed'){
      inp.disable();
    } else {
      inp.enable();    
    }
    ...

答案 1 :(得分:1)

在定义filterCombo方法时,将其视为全局范围。这就是为什么没有this.up的原因,因为这里是全局的。

要使代码正常工作,您需要在调用函数时传递作用域,只需替换

    listeners: {
            select : function(combo, records) {
                filterCombo(combo, records);
                }
            }

    listeners: {
            select : function(combo, records) {
                filterCombo.apply(this,[combo, records]);
                }
            }

请注意使用apply来更改您方法中的行为。

答案 2 :(得分:0)

解决方案:

function filterCombo(combobox, records) {
    if (records.data.name == 'Postponed'){
        var inp = combobox.up('window').getComponent('MyTextField');
        console.log(inp);
        inp.disable();
    }
    ...
}); 

说明:

您要做的是获取对您的textfield的引用,然后将其禁用。

  • 您的texfield配置使用itemId,因此您必须使用texfield的容器getComponent()方法
  • 要获取textfield容器,请使用combobox.up('window'),而不是this.up('window')