Модульное приложение Backbone.js Marionette с маршрутизатором на контроллере - маршруты не работают

В настоящее время я переписываю уже существующее приложение, используя фреймворк Backbone.js Marionette. Новый стек должен быть достаточно модульным, чтобы можно было легко добавлять новые контроллеры. Приложение имеет серверную часть node.js и предоставляет ответ json для каждого вызова.

Приложение определяется с использованием (как уже было сказано) приложения Marionette:

PlugUI.js: var PlugUI = new Backbone.Marionette.Application();

PlugUI.addRegions({
//  adminBarRegion: "#adminbar",
  contentRegion: "#content"
});

PlugUI.bind("routing:started", function(options){
  Backbone.history.start();
  PlugUI.Navigation.showNavigation();
});

Backbone.Marionette.TemplateCache.prototype.loadTemplate = function(templateId, callback){
  ...
});
}

Так что, я думаю, это довольно стандартно. Затем я предоставляю «контроллер» с некоторым довольно стандартным содержимым (имеется в виду модель, представление и методы маршрутизатора), например:

PlugUI.module("Status", function(Status, PlugUI, Backbone, Marionette, $, _) {
  // define the model
  Status.Status = Backbone.Model.extend({
    defaults: {
       ...
    },
    urlRoot: function() {
      return '/api/status';
    },

    fetchStatus: function() {
      var status = new Status.Status();
      status.fetch({
        success: function(data, response){
          Status.showStatus(response);
        }
      })
    }
  });

  Status.showStatus = function(model){
  var status = new Status.Status(model);
  var statusView = new Status.StatusView({
    model: status
  });

  PlugUI.layout.main.show(statusView);
  // add trigger, so that navbar is shown ;-)
  PlugUI.vent.trigger("navbar:show", "status-icon");
}

Status.StatusView = Backbone.Marionette.ItemView.extend({
  tagName: "div",
  className: "one-third column statusbox",
  template: "#status"
});

Status.Router = Backbone.Marionette.AppRouter.extend({
  appRoutes: {
    "status": "showUniqueStatus"
  }
});  

PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})
})

Это работает довольно хорошо, пока я напрямую запускаю представление этого одного контроллера. Если я добавлю еще один контроллер с такими же вещами и вызову метод show через маршрутизатор, то в основном ничего не произойдет. Теперь я добавил событие во внешнем интерфейсе, чтобы показать представление в новом контроллере, и это работает, но я думал, что все должно работать через маршрутизатор. Я что-то не так понял?

Полный (не рабочий) исходный код можно найти в проекте github.

Любая помощь очень ценится.


person triplem    schedule 23.07.2012    source источник


Ответы (3)


Я не совсем уверен, но думаю, что проблема в вашем инициализаторе (при условии, что вы используете последнюю версию Backbone.Marionette):


PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})

Вместо этого попробуйте Status.addInitializer


Status.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})
person Derick Bailey    schedule 07.08.2012

Извините за действительно очень долгую задержку, но...

Предлагаемое решение (перемещение инициализаторов) является частью решения. Кроме того, я запустил событие «routing:started», и это событие запустило «Backbone.history.start();». Я переместил вызов этого метода в «инициализировать: после», теперь все работает идеально.

PlugUI.bind("initialize:after", function(optionns) {
  console.log("initialize:after");
  Backbone.history.start();
});
person triplem    schedule 30.09.2012

Я предполагаю, что это происходит довольно поздно, но попробуйте запустить историю Backbone следующим образом.

PlugUI.on("before:start", function(options) {
   console.log("Starting history before start");
   Backbone.history.start();};

Я потратил на это достаточно времени.

PlugUI.on("start") не будет работать, а на "before:start" будет

person Northstar11    schedule 30.08.2014