#javascript #backbone.js #instantiation
#javascript #backbone.js #создание экземпляра
Вопрос:
Продолжая мои поиски, чтобы узнать больше о Backbone.js Я пришел к ситуации, когда я хотел бы создать экземпляр магистрального приложения программно. Это происходит в ситуации, когда весь сайт / страница не является базовым приложением, но вместо этого открывается модальное, затем заполняется (базовая структура для базового приложения), а затем я хотел бы запустить базовое приложение (чей JavaScript также был загружен при открытии модального). Я бы предпочел создать экземпляр приложения Backbone «вручную», если это возможно, т. Е. Чтобы оно не выполнялось автоматически при загрузке его скрипта.
Типичный формат магистрали, который я использую, выглядит следующим образом:
var myApp = (function($) {
var myModel = Backbone.Model.extend({
...
});
var modelInstance = new myModel({
...
});
var myView = Backbone.View.extend({
...
});
var viewInstance = new myView({
...
});
}
Но вышеупомянутое автоматически выполняется при загрузке файла сценария, затем созданные представления пытаются привязать / отобразить связанные с ними элементы DOM и т. Д. Есть ли способ отложить выполнение анонимной функции, чтобы я мог загрузить скрипт при подготовке модального, но затем запустить приложение Backbone по команде [немного] позже?
Большое спасибо за любую информацию по этому поводу.
Ответ №1:
Вы должны поместить компоненты вашего приложения в объект с init
помощью метода, который затем можно вызвать при открытии модального диалогового окна. Вот пример структуры:
window.App = {
Models: {},
Views: {},
Routers: {},
init: function () {
var app = new window.App.Routers.main;
Backbone.History.start();
return app;
}
};
window.App.Models.Foo = Backbone.Model.extend({
// ...
});
window.App.Views.FooView = Backbone.View.extend({
// ...
});
window.App.Routers.main = Backbone.Router.extend({
// ...
});
window.modalDialog.onOpen = function () {
window.app = window.App.init();
};
Вышесказанное предполагает, что у вас есть глобальная переменная modalDialog
, представляющая ваше модальное окно, которая вызывает его onOpen
обратный вызов при отображении окна.
Комментарии:
1. Спасибо за ответ. Я поиграл с некоторыми идеями, полученными из вашего примера, и я верю, что это сработает. Вот следующий вопрос: почему window.app.init возвращает экземпляр window.App.Routers.main ? Это произвольный выбор (в отличие от экземпляра, скажем, window.App.Models.Foo)?
2. Этого не должно быть. Многие приложения инициализируются путем создания экземпляра маршрутизатора и запуска истории, но его можно запустить практически любым способом. Другим наиболее вероятным выбором было бы создание экземпляра представления.
3. Хорошо ли этот метод работает с require.js ? У меня есть аналогичное решение, и я пытаюсь объявить его в модуле, и он лает