Backbone Marionette不会开火

时间:2017-06-13 12:29:56

标签: javascript backbone.js marionette

我正在使用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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

移动此

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 not firing on app start

答案 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

  

我们提供appRoutesroutes之间的主要区别   控制器上的回调,而不是直接在路由器本身上。   [...]   当AppRouter扩展Backbone.Router时,您还可以定义routes   其回调必须出现在AppRouter

的属性