Данный компонент позволяет динамически создавать menu для Ext.button.Button, в качестве источника данных он использует Ext.data.TreeStore. Он может использоваться для локализации или разрешать пользователям различные действия в зависимости от прав. При перезагрузке store компонент изменит структуру внутреннего меню. Я реализовал функцию простого фильтра, чтобы показать изменение состояния меню на лету.
Ext.define('app.ux.button.DynamicMenu', {
extend: 'Ext.button.Button',
store: false,
loadMessage: "Loading...",
showTreeStoreLoading: true,
initComponent: function () {
this.initMenu();
this.callParent();
},
initMenu: function () {
this.getStore().on('beforeload', this.onStoreBeforeLoad, this);
this.getStore().on('load', this.onStoreLoad, this);
if (this.getStore().isLoaded()) {
this.createMenu();
}
},
onStoreBeforeLoad: function () {
if (this.showTreeStoreLoading) {
this.setLoading(this.loadMessage);
}
},
onStoreLoad: function (store) {
store.on('datachanged', this.onStoreDataChanged, this);
this.createMenu();
},
onStoreDataChanged: function () {
console.log('datachanged');
this.createMenu();
},
createMenu: function () {
this.setLoading(false);
var rootNode = this.getStore().getRoot();
rootNode.menu = Ext.create('Ext.menu.Menu');
this.setMenu(rootNode.menu);
rootNode.eachChild(this.createMenuItem, this);
},
createMenuItem: function (record) {
var menuItem = Ext.create('Ext.menu.Item', {
text: record.get('text'),
glyph: record.get('glyph'),
record: record,
handler: this.menuItemHandler
});
record.parentNode.menu.add(menuItem);
if (!record.isLeaf()) {
var menu = Ext.create('Ext.menu.Menu');
menuItem.setMenu(menu);
record.menu = menu;
record.item = menuItem;
record.eachChild(this.createMenuItem, this);
}
},
getStore: function () {
if (this.store.isStore) {
return this.store;
} else {
return Ext.StoreManager.lookup(this.store);
}
},
menuItemHandler: Ext.emptyFn
});
Fiddle:
А как здесь работает store? Где хранятся записи? Т.е. в данном варианте нужно использовать сторонний TreeStore и в this.store указывать его storeId?