我正在使用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's working
},
listSinglePost: function(model) {
// Fetch a single post and display it. It's working
}
}
MyBlog.addInitializer(function() {
console.log('initializer'); // It's firing
new MyBlog.Router({
controller: API
});
});
关于在naviagate上使用触发器的Derick Bailey, Marionette's creator, said:
它鼓励糟糕的应用程序设计,强烈建议您不要这样做 将
trigger:true
传递给Backbone.history.navigate
。
我在这里缺少什么?
答案 0 :(得分:0)
移动此
if ( Backbone.history )
Backbone.history.start({ pushState: false });
if ( Backbone.history.fragment === '' )
API.listAllPosts();
else
API.listSinglePost( Backbone.history.fragment );
在应用程序启动之后或在initialize:after
事件处理程序中。
答案 1 :(得分:0)
在创建路由器实例之前启动Backbone历史记录。
在创建路由器之后移动它。
MyBlog.addInitializer(function() {
new MyBlog.Router({ controller: API });
// should be started after a router has been created
Backbone.history.start({ pushState: false });
});
另一件事是回调should be defined inside of a controller或您应该将appRoutes
更改为routes
。
我们提供
的属性appRoutes
和routes
之间的主要区别 控制器上的回调,而不是直接在路由器本身上。 [...] 当AppRouter
扩展Backbone.Router
时,您还可以定义routes
其回调必须出现在AppRouter
。