Создание Backbone триггером?(Или Как отложить выполнение анонимной функции?) - PullRequest
0 голосов
/ 14 октября 2011

Продолжая мои поиски, чтобы узнать больше о Backbone.js, я попал в ситуацию, когда я хотел бы создать экземпляр приложения Backbone программным способом. Это происходит в ситуации, когда весь сайт / страница не является приложением Backbone, а вместо этого открывается модальное окно, затем заполняется (базовая структура для приложения Backbone) и затем . Я хочу запустить приложение Backbone. (чей JavaScript также был загружен при открытии модального окна). Я бы предпочел создавать экземпляр приложения Backbone «вручную», если это возможно, то есть, чтобы оно не выполнялось автоматически при загрузке его скрипта.

Типичный формат 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 Ответ

3 голосов
/ 14 октября 2011

Вы должны поместить компоненты вашего приложения в объект с помощью метода 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 при отображении окна.

...