2012-04-10 3 views
4

У меня есть небольшой опыт работы с ExtJS3 и теперь, начиная с версией 4.ExtJS4 - как получить родительскую сетку на changechange?

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

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

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

EDIT: решение было использовать refs свойство в контроллере:

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


selectionchange: this.activateTbButtons 

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

ответ

1

EDIT

Я принял взглянуть на документы для события 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

+0

я не должен быть в состоянии получить доступ к 'view.tbar' тогда? aahhh ... oops, это настройка конфигурации, а не свойство – Madd0g

+0

Я отредактировал ответ. Представление не передавалось обработчику. Только модель выбора, выбранные элементы и т. Д. –

+1

wow, этот метод 'refs' довольно хорош, он отлично работает с ним – Madd0g

10

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

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

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

selectionchange: function (view, selected, opts) { 
//get to grid?? 
var grid = view.view.ownerCt; 
} 
+0

Удивительный !! Оно работает. –

3

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

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

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

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

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

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

+0

Вы только что сделали мою пятницу! – emolaus

1

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

var grid = selectionModel.view.ownerCt.ownerCt; 
+3

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

Смежные вопросы