Я создаю простое приложение, использующее Backbone и Marionette. Это просто, чтобы получить список сообщений Wordpress (используя API) и отобразить его. Это очень простое приложение, поэтому оно не является модульным.
У меня есть следующее (все это помещено в один файл):
if ( Backbone.history )
Backbone.history.start({ pushState: false });
if ( Backbone.history.fragment === '' )
API.listAllPosts();
else
API.listSinglePost( Backbone.history.fragment );
// Is not firing anything from here...
MyBlog.Router = Marionette.AppRouter.extend({
appRoutes: {
'': 'listPosts',
':post_name': 'listSingle'
},
listPosts: function() {
console.log('router');
API.listAllPosts();
},
listSingle: function(model) {
console.log('router, single');
API.listSinglePost(model);
}
});
// ...to here
var API = {
listAllPosts: function() {
// Fetch all posts and display it. It working
},
listSinglePost: function(model) {
// Fetch a single post and display it. It working
}
}
MyBlog.addInitializer(function() {
console.log('initializer'); // It firing
new MyBlog.Router({
controller: API
});
});
Как сказал разработчик Marionette Дерик Бэйли, об использовании триггеров на naviagate:
это поощряет плохой дизайн приложения, и настоятельно рекомендуется, чтобы вы не проходили
trigger:true
дляBackbone.history.navigate
.
Что мне здесь не хватает?
Перед созданием экземпляра маршрутизатора вы запускаете историю магистрали.
Просто переместите это, чтобы после создания маршрутизатора.
MyBlog.addInitializer(function() {
new MyBlog.Router({ controller: API });
// should be started after a router has been created
Backbone.history.start({ pushState: false });
});
Другое дело, что обратные вызовы должны быть определены внутри контроллера или вы должны изменить appRoutes
на routes
.
Основное различие между
appRoutes
иroutes
заключается в том, что мы предоставляем обратные вызовы на контроллере, а не непосредственно на маршрутизаторе. [...] ПосколькуAppRouter
расширяетBackbone.Router
, вы также можете определить атрибутroutes
чьи обратные вызовы должны присутствовать вAppRouter
.
Переместите это
if ( Backbone.history )
Backbone.history.start({ pushState: false });
if ( Backbone.history.fragment === '' )
API.listAllPosts();
else
API.listSinglePost( Backbone.history.fragment );
после того, как ваше приложение запускается или внутри initialize:after
обработчика события.
Проверьте этот предыдущий вопрос: Marionette.js appRouter не запускается при запуске приложения
#
) в href
ваших ссылок?