Создание экземпляра магистрали с помощью триггера? (Или как отложить выполнение анонимной функции?)

#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 ? У меня есть аналогичное решение, и я пытаюсь объявить его в модуле, и он лает