Пытаюсь понять Ext.require, Ext.class.require и Ext.Loader

#extjs #extjs4 #extjs-mvc

#extjs #extjs4 #extjs-mvc

Вопрос:

Итак, я унаследовал этот проект extjs 4.1.3 и пытаюсь его понять.

Я заметил, что везде есть как Ext.require, так и Ext.define require . Код состоит из большого количества шаблонного кода из sencha docs, и я чувствую, что в нем много избыточности. Это создает много беспорядка, и я чувствую, что неправильно, что когда я добавляю файл, мне приходится добавлять его несколько раз (в Ext.require и Ext.define required ).

Пара вопросов:

1) Как я могу определить, действительно ли требуется… требуется? Насколько я понимаю, он только сообщает веб-странице, чтобы загрузить что-то сейчас или позже (это может быть связано с вопросом 3). Гарантированно ли я увижу предупреждения от Ext о том, что «вы должны включить abc», если эти файлы необходимы?

2) Есть ли какая-либо разница между Ext.require и Ext.define requires? Нужны ли мне оба? Если мне нужен только один, является ли он более «стандартным», чем другой?

3) Что именно делает «Ext.Loader.setConfig({enabled: true});»? Я предполагаю, что это позволяет ext динамически загружать вещи, если они мне конкретно не требуются. Разве мне тогда вообще не нужны требования? Я не говорю, что это хорошая практика, но правда ли это? На самом деле, если что, разве это не плохая практика? В конечном итоге вы потеряете отслеживание зависимостей, если они у вас не записаны. Или вы «доверяете» Ext.Loader позаботиться обо всем, что касается зависимостей, чтобы вам даже не пришлось беспокоиться об этом.

Причина, по которой я спрашиваю, потому что я думал, что это правда, но после приведенного ниже опыта я думаю, что это не так.

Я думал, что понял это, но, видимо, моя интерпретация Ext.Loader (вопрос 3) неверна, потому что, если я прокомментирую все мои требования, я получу

 [07:15:05.577] Error: [Ext.createByAlias] Cannot create an
instance of unrecognized alias: layout.border
  

Если я выну ‘Ext.layout.*. Почему это не загружается динамически, если есть Ext.Loader.setConfig({enabled: true})?

TLDR: я не знаю, когда безопасно / рекомендуется использовать Ext.require/ Ext.define requirements . Если я не вижу никаких предупреждений, и мое приложение работает, означает ли это, что у меня все хорошо, или все еще есть шанс, что что-то «загружается» так хорошо, как могло бы быть? И что делает Ext.Loader.setConfig({enabled: true}) ?

РЕДАКТИРОВАТЬ: вот пример: app.js досье. Это просто кажется многословным, не так ли?

 Ext.Loader.setConfig({enabled: true});

Ext.Loader.setPath('Ext.ux', 'ux');

Ext.require([
'Ext.layout.*',
'Ext.ux.*',
'Ext.grid.*',
'APP.controller.Controller',
'APP.view.MapPanel',
'APP.view.FilterPanel',
'APP.view.Viewport'
]);

var start_app = function() {

var app = Ext.application({
    name: 'APP',
    appFolder: 'app',
    requires: [
    ],
    autoCreateViewport: true,
    uses: [
        'APP.controller.Controller',
        'APP.view.MapPanel',
        'APP.view.FilterPanel',
        'APP.view.Viewport'
    ],
    launch: function() {

    },
    controllers: [
        'APP.controller.Controller'
    ]
});
}
  

Ответ №1:

В приведенном выше коде вам нужно только controllers:['Controller'] . В свою очередь, в файле контроллера, который вам нужен views:[] , stores:[] и models:[] в зависимости от того, что вы хотите, чтобы контроллер извлекал с сервера.

Другой пример: допустим, вы кодируете сетку, и она использует столбец number, поэтому вам нужно requires:['Ext.grid.column.Number' в конфигурации сетки.

Что я делаю, так это то, что я помещаю туда минимум, который, по моему мнению, требуется, а затем смотрю консоль. Либо я получаю ошибку и исправляю ее, либо получаю предупреждение «Синхронная загрузка», которое я также исправляю.

Для получения более подробной информации смотрите: http://www.sencha.com/blog/countdown-to-ext-js-4-dynamic-loading-and-new-class-system

Комментарии:

1. Существует ли какой-либо «стандарт» для использования require vs requires ? Когда использовать Ext.require([]) против Ext.whatever({ требуется:[]})

2. Логика такова: «компонент / класс»требует» других классов», поэтому, если это отношение известно, тогда используйте requires:[] . В противном случае используйте Ext.require() — мне это нужно очень, очень редко.

3. Извините, я немного запутался. Я понимаю логику «требования» чего-либо, но когда «требует» отличается от «требует». Что вы подразумеваете под «если это отношение известно?» Кстати, большое вам спасибо за помощь!

4. Если вы объявляете requires:[] компонент или класс, и Ext начинает выполняться Ext.define , и он обнаруживает, что некоторые (или все) другие классы, перечисленные в requires:[] , не загружены, тогда определение приостанавливается, загружаются требуемые классы (кстати, с внутренним использованием Ext.require() ), а затем определение возобновляется. Если вы вызываете require вручную, классы, которые вы передаете в качестве аргумента, просто загружаются без какого-либо отношения к чему-либо. Пожалуйста, обратите внимание, что загрузка происходит асинхронно.

5. Немного поздно, но я понимаю, что вы имели в виду в своих предыдущих ответах. Если файлу js требуется класс extjs, используйте Ext.require() . Если классу ExtJS требуется класс extjs, используйте свойство requireds .