Extjs4 как поменять магазин в трипане - PullRequest
4 голосов
/ 17 сентября 2011

У меня есть несколько магазинов дерева меню в «app / store /», таких как «menu1.js», «menu2.js».На моей веб-странице у меня есть панель навигации в верхней области со множеством кнопок для управления деревом меню в левой области для изменения меню.Но я не знаю, как изменить магазин в этой панели дерева.Вот мой код:

app / store / Menus1.js

Ext.define('Crm.store.Menus1', {
    extend: 'Ext.data.TreeStore',
    root: {
        expanded: true, 
        children: [{    
            text: "subroot1",
            expanded: true,
            children:[
                { id: 'item01', text: "item1", leaf: true },
                { id: 'item02', text: "item2", leaf: true },
            ]
        }, {
            text: "subroot2",, 
            expanded: true, 
            children: [
                { id: 'item03', text: "item3", leaf: true },
                { id: 'item04', text: "item4", leaf: true }
            ]
        }]
    }
});

app / store / Menus2.js

Ext.define('Crm.store.Menus2', {
    extend: 'Ext.data.TreeStore',
    root: {
        expanded: true, 
        children: [{
            text: "subroot1",
            expanded: true,
            children:[
                { id: 'item05', text: "item5", leaf: true },
                { id: 'item06', text: "item6", leaf: true },
            ]
        }, {
            text: "subroot2",, 
            expanded: true, 
            children: [
                { id: 'item07', text: "item7", leaf: true },
                { id: 'item08', text: "item8", leaf: true }
            ]
        }]
    }
});

app / view / MenuBar.js(т.е.: я не устанавливаю его хранилище)

Ext.define('Crm.view.MenuBar', {
    extend: "Ext.panel.Panel",
    alias:'widget.crm_menubar',
    initComponent: function() {
        Ext.apply(this, {
            id: 'crm-menuBar',
            xtype:'panel',
            width: 212,
            frameHeader:false,
            hideCollapseTool:true,
            split: true,
            collapsible:true,
            collapseMode: 'mini',
            items: [
                Ext.create('Ext.tree.Panel', {
                    id: 'menutree',
                    border: false,
                    margin:'5 4 0 4',
                    height: '98%',                  
                    rootVisible: false,
                }),
            ]
        });
        this.callParent();
    }
});

app / controller / Navi.js

Ext.define('Crm.controller.Navi', {
    extend: 'Ext.app.Controller',
    requires: [ 'Crm.store.Menus1', 'Crm.store.Menus2' ],
    stores: [ 'Menus1','Menus2' ],
    refs: [
        { ref: 'crm_naviationBar', selector: 'crm_naviationBar' },
        { ref: 'crm_menubar', selector: 'crm_menubar' } 
    ],
    init: function(){
        var menutree = Ext.getCmp('menutree');
        var menustore = menutree.getStore();
        menustore = Menus1;   // I want initial the menu's store with Menus1
        //menustore = Ext.create('Crm.store.Menus1');  

        this.control({
            'button': {
                click: this.onItemClicked,
                scope: this
            } 
        });
    },
    onItemClicked: function(btn,eventObj){
        var menustore = Ext.getCmp('menutree').getStore();
        var btnId = btn.getId();

        if (btnId == 'btn_menus1') { //When button1 is clicked, change menu to menus1
            menustore = Menus1;
            //menustore = Ext.create('Crm.store.Menus1');       
        } else if (btnId == 'btn_menus2') { //When button2 is clicked, change menu to menus2
            menustore = Menus2;
            //menustore = Ext.create('Crm.store.Menus1');
        }
    }
});

Ответы [ 4 ]

1 голос
/ 17 января 2012

К сожалению, это ошибка, которую Сенча игнорировал много-много месяцев: (

http://www.sencha.com/forum/showthread.php?143843-Calling-reconfigure%28%29-on-Ext.tree.Panel-throws-error

0 голосов
/ 11 февраля 2014

Я расширил хранилище деревьев по умолчанию и написал метод setStore (), как показано ниже.Не делайте вид, что это лучшее решение, но оно работает для ExtJS 4.1.1 правильно.Я считаю, что не требуется много изменений для поддержки других версий.

setStore: function(store) {
    var me=this,
        view;

    view = me.getView();

    me.removeManagedListener('beforeload'); 
    me.removeManagedListener('load');   

    me.store.clearListeners();
    me.store.clearManagedListeners();

    me.store = store;

    if (Ext.isString(me.store)) {
        me.store = Ext.StoreMgr.lookup(me.store);
    } else if (!me.store || Ext.isObject(me.store) && !me.store.isStore) {
        me.store = new Ext.data.TreeStore(Ext.apply({}, me.store || {}, {
            root: me.root,
            fields: me.fields,
            model: me.model,
            folderSort: me.folderSort
        }));
    } else if (me.root) {
        me.store = Ext.data.StoreManager.lookup(me.store);
        me.store.setRootNode(me.root);
        if (me.folderSort !== undefined) {
            me.store.folderSort = me.folderSort;
            me.store.sort();
        }
    }

    view.store.treeStore = me.store;

    view.setRootNode(me.store.getRootNode());

    me.mon(me.store, {
        scope: me,
        rootchange: me.onRootChange,
        clear: me.onClear
    });

    me.relayEvents(me.store, [
        /**
         * @event beforeload
         * @inheritdoc Ext.data.TreeStore#beforeload
         */
        'beforeload',

        /**
         * @event load
         * @inheritdoc Ext.data.TreeStore#load
         */
        'load'
    ]);

    me.mon(me.store, {
        /**
         * @event itemappend
         * @inheritdoc Ext.data.TreeStore#append
         */
        append: me.createRelayer('itemappend'),

        /**
         * @event itemremove
         * @inheritdoc Ext.data.TreeStore#remove
         */
        remove: me.createRelayer('itemremove'),

        /**
         * @event itemmove
         * @inheritdoc Ext.data.TreeStore#move
         */
        move: me.createRelayer('itemmove', [0, 4]),

        /**
         * @event iteminsert
         * @inheritdoc Ext.data.TreeStore#insert
         */
        insert: me.createRelayer('iteminsert'),

        /**
         * @event beforeitemappend
         * @inheritdoc Ext.data.TreeStore#beforeappend
         */
        beforeappend: me.createRelayer('beforeitemappend'),

        /**
         * @event beforeitemremove
         * @inheritdoc Ext.data.TreeStore#beforeremove
         */
        beforeremove: me.createRelayer('beforeitemremove'),

        /**
         * @event beforeitemmove
         * @inheritdoc Ext.data.TreeStore#beforemove
         */
        beforemove: me.createRelayer('beforeitemmove'),

        /**
         * @event beforeiteminsert
         * @inheritdoc Ext.data.TreeStore#beforeinsert
         */
        beforeinsert: me.createRelayer('beforeiteminsert'),

        /**
         * @event itemexpand
         * @inheritdoc Ext.data.TreeStore#expand
         */
        expand: me.createRelayer('itemexpand', [0, 1]),

        /**
         * @event itemcollapse
         * @inheritdoc Ext.data.TreeStore#collapse
         */
        collapse: me.createRelayer('itemcollapse', [0, 1]),

        /**
         * @event beforeitemexpand
         * @inheritdoc Ext.data.TreeStore#beforeexpand
         */
        beforeexpand: me.createRelayer('beforeitemexpand', [0, 1]),

        /**
         * @event beforeitemcollapse
         * @inheritdoc Ext.data.TreeStore#beforecollapse
         */
        beforecollapse: me.createRelayer('beforeitemcollapse', [0, 1])
    });    

    // If the root is not visible and there is no rootnode defined, then just lets load the store
    if (!view.rootVisible && !me.getRootNode()) {
        me.setRootNode({
            expanded: true
        });
    }
}
0 голосов
/ 11 октября 2012

Пожалуйста, просмотрите эту тему:

http://www.sencha.com/forum/showthread.php?143843-Calling-reconfigure%28%29-on-Ext.tree.Panel-throws-error

Согласно последним документам 4.1, reconfigure() было удалено из Ext.tree.Panel.

Примечание:Тем не менее, как ни странно, вызов reconfigure() не даст ошибку, то есть метод все еще существует, но я не могу заставить его работать правильно, так как он возвращает другую ошибку.

Также см. Обсуждение в комментариях4.0:

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.tree.Panel-method-reconfigure

0 голосов
/ 03 ноября 2011

Вы сможете использовать метод reconfigure() на TreePanel после получения вашего магазина.Это тот же процесс, который вы использовали бы для изменения хранилища сетки.

var store = Ext.getStore('newStore');
var menutree = Ext.getCmp('menutree');

menutree.reconfigure(store);

Полная документация здесь: Ext.Tree.Panel метод перенастройки .

Примечание: В документации есть комментарий о том, что этот метод не работает, но в нем не указана версия ExtJS.Возможно, вам придется подождать обновленной версии инфраструктуры, прежде чем она будет работать, как описано в документации.

...