ExtJS4 – как получить родительскую сетку при изменении выбора?

У меня мало опыта работы с ExtJS3, и сейчас я начинаю с версии 4.

В моем контроллере у меня есть это:

init: function ()
{
    this.control({
        "userlist":
        {
            selectionchange: function (view, selected, opts)
            {
                 //get to grid??
            }
        }
    });
}

Как я могу получить доступ к сетке, в которой произошло это событие, без использования идентификатора? Я хочу включить/отключить кнопки на панели инструментов сетки (tbar), если есть выбранные элементы, но я не хочу давать какие-либо идентификаторы (не панель, а не отдельные кнопки)

РЕДАКТИРОВАТЬ: решение заключалось в использовании свойства refs в контроллере:

refs:
[
    {
        ref: "list",
        selector: "userlist"
    }
],


selectionchange: this.activateTbButtons

activateTbButtons: function (selected, opts)
{
    if (selected.selected.length == 1)
    {
        var tb = this.getList().query("toolbar");
    }
}

person Madd0g    schedule 10.04.2012    source источник


Ответы (4)


ИЗМЕНИТЬ

Я просмотрел документы для события selectionChange:

selectionchange( Ext.selection.Model this, Ext.data.Model[] selected, Object eOpts )

Представление не передается обработчику selectionchange. Простой способ справиться с этим — либо использовать Ext.getCmp(), либо использовать ссылки, как показано в документации для Ext.app.Controller:

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.app.Controller

person Arun V    schedule 10.04.2012
comment
разве тогда я не смогу получить доступ к view.tbar? аааа... упс, это параметр конфигурации, а не свойство - person Madd0g; 10.04.2012
comment
Я отредактировал ответ. Представление не передавалось обработчику. Только модель выбора, выбранные предметы и т.д. - person Arun V; 10.04.2012
comment
вау, этот метод refs довольно хорош, он отлично с ним работает - person Madd0g; 10.04.2012
comment
@ArunV К вашему сведению, SelectionModel содержит ссылку на представление. Таким образом, оно передается в обработчик событий selectionchange. На мой взгляд, Ext.getCmp() плохой (особенно с ext4+), но refs может быть хорошим в зависимости от архитектуры вашего приложения. - person BenSwayne; 01.07.2013

Только что узнал, что вы можете использовать представление атрибутов и представления в Ext.selection.Model.

Это может быть полезно в тех случаях, когда вы, скажем, открываете несколько экземпляров ваших объектов.

Итак, чтобы получить доступ к сетке в вашем примере:

selectionchange: function (view, selected, opts) {
 //get to grid??
 var grid = view.view.ownerCt;
}
person Adezj    schedule 16.11.2012

Имея ту же проблему, я обнаружил, что в предыдущих ответах отсутствуют некоторые моменты. Короче говоря, я рекомендую:

selectionchange: function (selModel, selected, eOpts) {
  var grid = selModel.view.ownerCt;
}

Это уже было предложено Adezj, хотя оно относится к событию selectionchange, которое имеет представление в качестве первого аргумента и не применимо к ExtJS 4.0.7+. (Не думаете, что в selectionchange когда-либо использовалось представление в качестве аргумента?)

Обратите внимание, что это может официально не поддерживаться ExtJS, поскольку свойство view модели выбора вообще не упоминается в документах API.

Другой подход заключается в использовании Ext.ComponentQuery.query(...) или определении ссылок в контроллере, как это было предложено Аруном В., что в основном представляет собой просто удобную оболочку для Ext.ComponentQuery.query(). Это прекрасно работает, если у вас есть только отдельные экземпляры класса сетки, но вам нужно позаботиться о том, чтобы у вас было несколько экземпляров одного и того же класса сетки. Простое выполнение Ext.ComponentQuery.query('xtype-of-your-grid') вернет все экземпляры вашей сетки, и вам будет очень интересно узнать, в каком из них пользователь что-то выбрал.

Итак, в целом, я настоятельно рекомендую всегда двигаться вверх от компонента или объекта, вызвавшего событие, чтобы быть уверенным, что вы находитесь в правильной ветви иерархии компонентов, если только вы не уверены, что у вас никогда не будет более одного экземпляра тот класс, для которого вы пишете контроллер.

person blahgonaut    schedule 23.01.2013

//получить сетку

var grid = selectionModel.view.ownerCt.ownerCt;
person Jak    schedule 13.06.2014
comment
Вы должны объяснить, почему этот ответ подходит и как он решит проблему исходного постера. - person Giacomo1968; 13.06.2014