Соглашения ExtJS MVC, наименование и поведение - PullRequest
2 голосов
/ 28 февраля 2012

В последнее время (2.x / 3.x) я просто использовал методы xtype & factory, чтобы получить экземпляр класса, который был настолько же быстрым.Теперь я запустил 4.x и свое первое приложение с MVC.Как описано в руководстве, шаблон MVC требует от меня расширения класса для каждого представления, которое я не хочу использовать, даже если я использую его только один раз.Но лучшая практика, написанная самим Сенчей, гласит:

просто расширяют для повторного использования или добавления функциональности

В моем случае мне нужнозарегистрировать целую группу классов, даже если они могут быть созданы из одного базового класса, за исключением некоторых параметров, таких как title, width,...

Еще один момент заключается в том, что контроллер перезаписывает любой StoreId по соглашению и также требует строгой типизации, то естьимя класса должно заканчиваться s.Но, насколько я знаю, я не могу сэкономить ни модель, ни хранилище в контроллере store / model-array, так что есть ли другой смысл для этого соглашения, потому что кажется, что он не щадит типизацию.

Следующий момент заключается в том, что после слияния с 3.X в 4.X начальное время загрузки приложения увеличилось, что, по-видимому, связано либо с множеством новых классов, которые необходимо определить, либо с тем, чтовсе контроллеры создаются при запуске из-за поведения по умолчанию шаблона MVC.Есть ли способ не создавать экземпляр контроллера автоматически и просто делать его ленивым, например, когда я запрашиваю его на контроллере приложения?

Да, я знаю, это куча вопросов, но я думаю, что они все вокругта же тема.

РЕДАКТИРОВАТЬ

После некоторого поиска исходного кода я больше не уверен в требовании s, когданазывать магазинЯ думал, что наткнулся на это во время прохождения учебника MVC.Кто-нибудь может это проверить?

РЕДАКТИРОВАТЬ 2

Мои выводы

Кружевное рендерингэто довольно просто.Прежде всего, Контроллер не должен быть упомянут в массиве контроллеров ApplicationController.Для создания экземпляра такого контроллера используйте ApplicationController.getController(pureClassName) [. Обратите внимание, что каждый контроллер содержит ссылку на ApplicationController, называемую application]. Теперь вам нужно знать, что метод init(application)и метод onLaunch(application) больше не вызывается ApplicationController, вам нужно сделать это самостоятельно.При вызове getController() ApplicationController сначала ищет, если во внутреннем эталонном кэше уже есть экземпляр этого контроллера, если нет, он создает экземпляр и вводит имя контроллера как Id.Таким образом, контроллеры являются своего рода синглтоном, и это прекрасноКонтроллер сам создает все методы получения для зарегистрированных магазинов, моделей и представлений и, по-видимому, создает их экземпляры (по крайней мере, для магазинов). Об ограничениях именования для магазинов нет ограничений относительно окончания с s.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Это очень действительные баллы.

Во-первых, следует отметить, что вам не нужно использовать MVC с ExtJS 4. Вы по-прежнему можете использовать стиль ExtJS 3 в своем коде.

Я предполагаю, что если вы понимаете преимущества MVC и решаете адаптировать его, то да - вам придется расширять классы и есть некоторые накладные расходы, но по общему признанию вы получите более чистый и многократно используемый код. Надо сказать, что, хотя вам необходимо расширить представления верхнего уровня, элементы в них могут быть закодированы в старом стиле. В дополнение к этому, в init () контроллера вы можете изменить некоторые конфиги вида (что позволяет меньше расширения класса, но больше кода контроллера).

Я должен признать, что если у вас есть опыт работы с ExtJS 3 и вы переходите на приложение в стиле MVC, вы в конечном итоге увидите, что преимущества перевешивают связанную с этим работу.

Лично я впервые узнал об этом бизнесе с магазинами. Поэтому я не могу много комментировать это.

Наконец, правильно написанное приложение ExtJs 4, использующее динамическую загрузку, должно загружаться быстрее, чем приложение ExtJS 3. Вы также можете скомпилировать версию Ext, которая включает в себя только код, используемый в вашем приложении. И да, вы можете создавать экземпляры контроллеров (а также их представления и хранилища), когда они вам нужны, что работает как чудо:

loadPage: function(aControllerName)
{
    // save recent page in a cookie
    Ext.util.Cookies.set('RecentPage', aControllerName);

    // Dynamically load the controller
    var iController = this.getController(aControllerName);

    // Manually initialise it
    iController.init();

    // Load the page (by getting the first view of the controller).
    var iPage = this.getView(iController.views[0]).create();

    // Add the page to the content panel.
    var iContentPanel = this.getContentPanel();

    iContentPanel.removeAll(true);

    iContentPanel.add(iPage);

    iContentPanel.doLayout();
}
1 голос
/ 29 февраля 2012

1.Izhaki хорошо ответил на ваш вопрос о ленивой инициализации контроллера.

2. На самом деле я не слежу за тобой по поводу имен магазинов. Нет ограничений на названия магазинов. Это всего лишь предложения соглашений об именах.

3. Метод Ext.define отлично подходит для определения ваших классов - как в Java или других языках OO. Однако это НЕ требуется, и вы можете просто использовать метод Ext.create для создания экземпляра компонента инфраструктуры и передачи ему настраиваемого объекта конфигурации. Вы также можете использовать Ext.define для создания базового класса, а затем вызвать Ext.create('MyBaseClass',{title:'mynew tile'});, чтобы получить слегка измененную версию базового класса.

Я рекомендую вам прочитать руководства Sencha по MVC и Система классов , а также ознакомиться с их примерами, чтобы лучше понять.

...