Проблема с TreeStore в приложении ExtJS 4.0 MVC - PullRequest
4 голосов
/ 09 мая 2011

Новая версия ExtJS может сделать ваш хром нестабильным (или это мой код?)!Позвольте мне объяснить мою ситуацию.

Я работаю над новой архитектурой MVC ExtJS 4.0.У меня есть панель дерева, отображающая меню приложений или навигацию.В соответствии с архитектурой, я попытался разделить панель дерева на контроллер, представление и отдельное хранилище.

Вот мой взгляд:

 Ext.define('CRM.view.menu.View', {
    alias: 'widget.menutree',
    extend: 'Ext.tree.Panel',

    initComponent: function() {

        console.log('initComponent of View...');

        Ext.apply(this, {
            title: 'Simple Tree',                       
            width: 200,             
            store: 'MainMenu',
            rootVisible: false
        });

        this.callParent(arguments);
    }
});

Магазин моего дерева:

 Ext.define('CRM.store.MainMenu', {
    extend: 'Ext.data.TreeStore', 

    constructor: function() {

        console.log('Constructor of MainMenu TreeStore');

        config = Ext.apply(this,{
            proxy: {
                type: 'ajax',
                url: 'data/menu.json'
            },root: {
                text: 'Menu',
                id: 'src',
                expanded: true
            }
        });

        this.callParent(arguments);

    }
}); 

И в моем контроллере я также предоставил информацию о своем магазине.Вот часть моей конфигурации контроллера:

Ext.define('CRM.controller.MainMenu',{
    extend: 'Ext.app.Controller',
    stores: ['MainMenu'],   
    refs: [
        {ref:'menu',selector: 'menutree'},
        {ref:'cp',selector: 'centerpane'}
    ],
        .
        .
        .

При начальном выполнении я получаю следующую ошибку:

У объекта MainMenu нет метода 'getRootNode'

Но теперь я получаю более странную ошибку: chrome just fails to display the app Обратите внимание, что Chrome останавливает выполнение в конструкторе хранилища дерева.

В то же время в Firefox: firefox executes better Firefox работает лучше, ноприложение не отображается!

После некоторой ошибки и ошибки ... Я нашел способ запустить приложение ... и это позволяет избежать использования моего магазина и напрямую предоставить информацию о магазине, как показано ниже:

 Ext.define('CRM.view.menu.View', {
    alias: 'widget.menutree',
    extend: 'Ext.tree.Panel',

    initComponent: function() {

        console.log('initComponent of View...');

        Ext.apply(this, {
            title: 'Simple Tree',                       
            width: 200,             
            store: {
                proxy: {
                    type: 'ajax',
                    url: 'data/menu.json'
                },root: {
                    text: 'Menu',
                    id: 'src',
                    expanded: true
                }
            },
            rootVisible: false
        });

        this.callParent(arguments);
    }
});

Теперь приложение выполняется без проблем!

Кто-нибудь пробовал создавать древовидную панель с использованием архитектуры MVC?Я понятия не имею, как это исправить!

1 Ответ

3 голосов
/ 12 мая 2011

Похоже, это известная проблема !!!Цитирование из форумов ExtJS :

Родительский класс "Ext.tree.Panel" ищет хранилище в менеджере магазина в методе "initComponent", но "Ext.tree.Panel "пытается использовать его раньше.

Итак, одним из способов было бы закодировать ваш магазин в ваше дерево другим способом - это переназначить магазин в методе initComponent.Вот код:

initComponent: function(){
  this.store = Ext.data.StoreManager.lookup(this.store);
  this.callParent(arguments);
} 
...