2

Помощь! У меня есть приложение ExtJS 4.2 MVC, которое будет содержать множество различных представлений. Однако каждый пользователь будет иметь доступ к простой доле всего набора. Очевидно, я не хочу загружать все Представления для каждого пользователя! Кроме того, каждое «разрешенное» представление должно быть загружено после входа пользователя.ExtJS4 MVC Lazy Загрузка

В прошлом (до MVC) я использовал Ext.create() для динамической загрузки моих файлов классов .js. Тем не менее, я пытаюсь использовать шаблон дизайна MVC, и все, что я читал в Интернете, показывает, что это, по-видимому, является ограничением ExtJS 4.2 MVC. Это правда? Ниже я попытался до сих пор.

Во-первых, определение пользовательского зрения (базовый пример контейнера):

Ext.define('My.custom.TestView', { 
    extend: 'Ext.container.Container', 
    alias: 'widget.myCustomTestView', 
    html: 'Test', 

    initComponent: function() { 
     this.callParent(arguments); 
    } 
}); 

Во-вторых, определение контроллера, который пытается загрузить/экземпляр пользовательского вида:

Ext.define('My.custom.TestController', { 
    extend: 'Ext.app.Controller', 

    // Empty array because I want to 
    // add views during run-time. 
    views: [ 
    ], 

    init: function() { 
     // Attempt #1: This produces an error. 
     this.getView('My.custom.TestView').create(); 

     // Attempt #2: This returns null. 
     Ext.widget('myCustomTestView'); 

     // Attempt #3: This appears it might work, but it's ugly! 
     Ext.create('My.custom.TestView'); 
     this.getView('My.custom.TestView').create(); 
    } 
}); 

Хотя # 3 единственное, что не дает ошибок, это не выглядит правильным для меня. Любые предложения/комментарии?

ответ

1

Ext.create() вызывает синхронную нагрузку, так что происходит, фактически проверяет, загружен ли зависимый файл js для вашего представления, если это не так, то он выполняет синхронную загрузку файла js и останавливает выполнение вашего кода до тех пор, пока js не будет загружен и не инициализирован Ext.Loader. Затем вы можете getView(). Create() в классе, потому что теперь ваш класс класса доступен в Ext.

Для двух других:

  1. производят бы ошибку, потому что его основывается на My.custom.TestView уже загружен, что это не так, поэтому он не может найти определение класса в том, что он загрузил, чтобы создать экземпляр этого.

  2. Возвращает null, скорее всего, из-за того, что реализован Ext.widget, чтобы поддерживать вызов Ext.widget(), который указывает имя виджета для класса, который еще не был загружен из-за взлома приложение.

И 1 и 2 отличаются от Ext.create() в том, что они сделать не вызова Ext.Loader разрешить файл класса и загрузить его, если он не будет найден, чтобы быть уже загружены в Внутренний. Они просто действуют на уже загруженный код и доступны в вашем приложении в момент их вызова.

Стоит немного почитать на Ext.Loader в Exts docs здесь http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.Loader