Установить запрет на редактирование поля в Ext.window.Window при условии - PullRequest
0 голосов
/ 12 сентября 2018

Мне нужно установить запрет на редактирование текстового поля в Ext.window.Window, при условии, что значение раскрывающегося списка установлено на Отложено.

Я пытаюсь сделать это в функции filterCombo с помощью:

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

inp.disable ();

но в консоли я получаю ошибку: Ошибка типа: 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 голосов
/ 13 сентября 2018

Когда вы определяете метод filterCombo, как вы его определяете, он принимает это как глобальную область видимости.Вот почему this.up не существует, поскольку это глобально.

Чтобы ваш код работал, вам нужно пропустить область при вызове вашей функции, просто замените

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

на

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

Обратите внимание на использование apply для изменения поведения этого метода в вашем методе.

0 голосов
/ 13 сентября 2018

Решение:

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

Объяснение:

Что вы хотите сделать, это получить ссылку на ваш textfield, а затемотключи это.

  • ваша texfield конфигурация использует itemId, поэтому вы должны использовать метод getComponent() контейнера texfield *, чтобы получить textfield использование контейнера combobox.up('window'), а не this.up('window')
0 голосов
/ 13 сентября 2018

Вы не можете использовать «this» вне области действия функции выбора, вы уже передаете «this» в качестве параметра «combobox», поэтому используйте его следующим образом:

function filterCombo(combobox, records) {

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

    if(records.data.name == 'Postponed'){
      inp.disable();
    } else {
      inp.enable();    
    }
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...