2014-08-29 2 views
0

Как использовать Ext.ComponentQuery.query с вложенными атрибутами в Sencha Touch?Как использовать Ext.ComponentQuery.query с вложенными атрибутами

например
var myHardtoGetObj = topLevelView.down('someview[config.categoryCfg.id=1]')[0]; 

Это заставляет меня "неперехваченную ошибку"

Дано:

Ext.define('SomeView', { 
    xtype : 'someview', 
    config : { 
     categoryCfg : { 
      id : 5, 
      name : 'someName' 
     } 
    } 
}); 

Возможно ли это?

Спасибо.

ответ

1

канонический способ делать вещи, как это добавляет пользовательский класс псевдо Искателя:

Ext.ComponentQuery.pseudos.hasCategoryId = function(components, selector) { 
    var result = [], 
     c, i, len; 

    for (i = 0, len = components.length; i < len; i++) { 
     c = components[i]; 

     if (c.config.categoryCfg && c.config.categoryCfg.id == selector) { 
      result.push(c); 
     } 
    } 

    return result; 
} 

Затем вы можете использовать этот псевдо-класс как на глобальном уровне с Ext.ComponentQuery.query и локально с помощью методов, как query, down и т.д .:

var allMatched, someComponent; 

allMatched = Ext.ComponentQuery.query(':hasCategoryId(1)'); 
someComponent = myPanel.down(':hasCategoryId(42)'); 

Подробнее о коже для кошки: ComponentQuery doc.

+0

Спасибо большое, мне очень понравился этот подход. –

+0

Где бы это было лучшее место, чтобы объявить это псевдо? метод запуска контроллера, где я буду использовать псевдо? –

+1

Ext.ComponentQuery является глобальным, и его псевдоиды также являются глобальными. Я бы предложил разместить этот код где-то наверху, поэтому он будет доступен по всему приложению. –

0

Хотя точно не ответил на вопрос, но вы можете немного поработать, чтобы заставить его работать.

вы можете добавить метод обновления на nestedConfig как так

Ext.define('myCoolClass', { 
    config : { 
     nestedConfig : { 
      nestedId : 5 
     }, 

     nestedId : null 
    }, 

    updateNestedConfig: function (nestedConfig) { 
     if (nestedConfig.nestedId) { 
      this.setNestedId(nestedConfig.nestedId); 
     } 
    } 
}); 

Поступая, что теперь у вас есть доступ к нормальной составляющей атрибута запроса

Ext.ComponentQuery.query('[nestedId=555]') 

В качестве примера. Если вы посмотрите на исходный код Sencha, то они используют это довольно много, как в NavigationView и TabPanels.

+0

с двойным вложенным именем не звучит правильно, в этом случае я скорее просто избавлюсь от nestedConfig и определю все атрибуты на уровне конфигурации ... плюс пришлось бы создать еще одну функцию, чтобы установить значение ... –

+0

btw convention говорит, что это должно быть «MyCoolClass»;) –

2

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

Ext.define('SomeView', { 
    xtype : 'someview', 
    config : { 
     categoryCfg : { 
      id : 5, 
      name : 'someName' 
     } 
    }, 

    hasCategoryId: function (id) { 
     return this.getCategoryCfg().id == id; 
    } 
}); 

Затем вы можете сделать запрос следующим образом:

Ext.ComponentQuery.query('someview{hasCategoryId(1)}'); 

или

topLevelView.down('someview{hasCategoryId(1)}'); 

Примечание: Синтаксис селектора is xtype {memberMethod()} без пробела между ними. Таким образом, оба селектора должны соответствовать (так же, как .class1.class2 в CSS). Также селектора должны быть в этом порядке, потому что набор результатов фильтруется каждым селектором по порядку, и если некоторые из компонентов не имеют метода hasCategoryId, он будет разбит только с помощью «{hasCategoryId (1)} '

+0

это действительно вариант, но, как сказал мне друг, интересно, насколько это проявляется против использования на самом деле атрибута ... –

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