Вот мой main.js перед использованием domReady:Как использовать domReady requireJS плагин правильно
require.config({
paths : {
loader : 'libs/backbone/loader',
jQuery : 'libs/jquery/jquery-module',
Underscore : 'libs/underscore/underscore-module',
Backbone : 'libs/backbone/backbone-module',
templates : '../Templates'
}
});
require([ 'app' ], function(app) {
app.initialize();
});
И app.js:
define([ 'jQuery', 'Underscore', 'Backbone', 'router',
'services/Initializers/MainFrameInitializer',
'services/Initializers/FlowsViewsInitializer',
'services/Initializers/EditModuleInitializer',
'services/Sandboxes/ModulesNavigationSandbox',
'services/Sandboxes/ApplicationStateSandbox', 'DataModel/Constants' ],
function($, _, Backbone, Router, MainFrameInitializer,
FlowsViewsInitializer, EditModuleInitializer, ModulesNavigationSandbox,
ApplicationStateSandbox, Constants) {
var initialize = function() {
// Pass in our Router module and call it's initialize function
MainFrameInitializer.initialize();
FlowsViewsInitializer.initialize();
EditModuleInitializer.initialize();
ApplicationStateSandbox.startCheckStatus();
ModulesNavigationSandbox.navigate(Constants.Modules.Home);
// Router.initialize();
};
return {
initialize : initialize
};
});
Все работает хорошо, пока я не optimize проекта. Я выяснил, что сценарий начинает работать до того, как DOM готов, что было не так до оптимизации. Во всяком случае, я хочу использовать плагин domReady, чтобы сначала загрузить DOM.
Но, по-видимому, я понятия не имею, как это сделать правильно. Вот новая версия main.js:
require.config({
paths : {
loader : 'libs/backbone/loader',
jQuery : 'libs/jquery/jquery-module',
Underscore : 'libs/underscore/underscore-module',
Backbone : 'libs/backbone/backbone-module',
templates : '../Templates'
}
});
require([ 'domReady', 'app' ], function(domReady, app) {
domReady(app.initialize);
});
Очень аккуратный и очень неправильно, потому что app
загружается параллельно с domReady
до DOM готова.
Как исправить это?
Спасибо.
EDIT
Я думаю, что я понял нашу проблему. Функции конструктора зависимостей app
не должны запускать какой-либо зависимый от DOM код. Они должны просто возвращать функции, захватывая зависимую от DOM логику. Эта логика должна быть выполнена от app.initialize
, которая гарантируется, когда DOM готов.
Почему неправильно загружать «domReady» и «приложение» параллельно? Вы только на самом деле вызываете код из 'app', когда DOM готов. Или я неправильно понял? –
Возможно, это я неправильно понял, как работает материал. Загрузка 'app' включает загрузку всех зависимостей приложений (и их довольно много), затем эти зависимости вызывается и результаты передаются в метод фабрики приложений, который возвращает само приложение. Если я правильно понимаю, зависимости 'app' выполняются параллельно с' domReady', что означает, что они могут запускаться до полной загрузки DOM. – mark
Ничего * работает * если ваша фабричная функция, которую вы передаете 'define()', фактически запускает код. Обычно фабричная функция просто создает объект со способами, которые можно назвать * в какой-то момент в будущем * (вы это сделали). Поэтому, даже если вызов 'define()' будет запускать заводскую функцию, вы будете делать только приложение * real *, когда захотите. Как вы сделали, передав 'app.initialize' функцию' domReady'. Мне это кажется прекрасным. –