В предыдущей статье мы создавали динамическое меню, в этой же мы создадим динамическую панель инструментов Ext.toolbar.Toolbar по аналогии.
Если вы собираетесь внедрять какие либо статичные компоненты в данную панель инструментов, вы должны сами подумать о механизме для поддержания определенного порядка.
PS: Кноки помечены флагом dynamicItem
Ext.define('app.ux.toolbar.Dynamic', { extend: 'Ext.toolbar.Toolbar', 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.createDynamicItems(); } }, onStoreBeforeLoad: function () { this.removeDynamicItems(); if (this.showTreeStoreLoading) { this.setLoading(this.loadMessage); } }, onStoreLoad: function (store) { store.on('datachanged', this.onStoreDataChanged, this); this.createDynamicItems(); }, onStoreDataChanged: function () { this.createDynamicItems(); }, removeDynamicItems: function () { var dynamicItems = this.query('button[dynamicItem=true]'); Ext.Array.each(dynamicItems, function (dynamicItem) { this.remove(dynamicItem); }, this); return this; }, createDynamicItems: function () { this.setLoading(false); this.removeDynamicItems(); var rootNode = this.getStore().getRoot(); rootNode.eachChild(this.createToolbarButton, this); }, createToolbarButton: function (record) { var button = Ext.create('Ext.button.Button', { text: record.get('text'), glyph: record.get('glyph'), record: record, dynamicItem: true, handler: this.menuItemHandler, scope: this }); if (!record.isLeaf()) { var menu = Ext.create('Ext.menu.Menu'); button.setMenu(menu); record.menu = menu; record.eachChild(this.createMenuItems, this); } this.add(button); }, createMenuItems: function (record) { var menuItem = Ext.create('Ext.menu.Item', { text: record.get('text'), glyph: record.get('glyph'), record: record, handler: this.menuItemHandler, scope: this }); if (record.isLeaf()) { record.parentNode.menu.add(menuItem); } else { var menu = Ext.create('Ext.menu.Menu'); menuItem.setMenu(menu); record.menu = menu; record.item = menuItem; record.parentNode.menu.add(menuItem); record.eachChild(this.createMenuItems, this); } }, getStore: function () { if (this.store.isStore) { return this.store; } else { return Ext.StoreManager.lookup(this.store); } }, menuItemHandler: function(menuItem) { this.fireEvent('menuItemSelect', this, menuItem.record); } });
Fiddle: