Как использовать Ext.ComponentQuery.query с вложенными атрибутами в Sencha Touch?
Например
var myHardtoGetObj = topLevelView.down('someview[config.categoryCfg.id=1]')[0];
Это вызывает у меня "неперехваченную ошибку"
Дано :
Ext.define('SomeView', {
xtype : 'someview',
config : {
categoryCfg : {
id : 5,
name : 'someName'
}
}
});
Это возможно?
Спасибо.
3 ответа
Канонический способ сделать это - добавить настраиваемый сопоставитель псевдоклассов:
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 .
Это действительно интересный вопрос. Кажется, что нет абсолютно простого решения, однако есть довольно быстрое решение. Вы можете изменить свой код просмотра на:
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)}');
Примечание : синтаксис селектора - xtype {memberMethod ()} без пробела между ними. Таким образом, оба селектора должны совпадать (так же, как .class1.class2 в CSS). Также селекторы должны быть в этом порядке, потому что набор результатов фильтруется каждым селектором по порядку, и если некоторые из компонентов не имеют метода hasCategoryId, он будет прерван только с помощью '{hasCategoryId (1)}'
Хотя это не совсем ответ на вопрос, но вы можете немного поработать, чтобы заставить его работать.
Вы можете добавить метод обновления в свой 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.
Похожие вопросы
Новые вопросы
extjs
Sencha Ext JS - это инфраструктура JavaScript для создания многофункциональных интернет-приложений (RIA).