如何防止骨干路由器在页面加载时调用事件

时间:2013-04-02 12:46:11

标签: backbone.js backbone-routing

此刻我有点困惑。我的路由函数正在第一次加载时执行,这在我的情况下并不好,因为我使用这些函数渲染内容,并且在第一次加载时我得到了重复的内容...好吧,我可以添加控制变量防止在第一个init上渲染,但我想用纯粹的骨干做... 这是我的代码:

var Router = Backbone.Router.extend({
    routes: {
       "": "home",
       "home": "home",
       "about": "about",
    },
    home: function(){
        getContent("home")
    },
    about: function(){
        getContent("about")
    },
    initialize: function(){
        Backbone.history = Backbone.history || new Backbone.History({silent:true});
    root = "kitchenV3/"+lang;
    var enablePushState = true;
    var pushState = !! (enablePushState && window.history && window.history.pushState);
    Backbone.history.start({
        silent: true,
        pushState: pushState,
        root: root
    });
    }

});

另一方面,如果我删除,回家“和”关于“方法并以这种方式编写它们,它们不会在第一次加载时执行。但这两者之间的实际差异是什么?是否可以像第一个例子那样编写代码,但是为了防止在第一次加载时执行?

router.on('route:home', function(id) {
      getContent("home")
});

感谢您的所有答案......

1 个答案:

答案 0 :(得分:3)

来自Backbone's doc
如果服务器已经渲染了整个页面,并且您不希望在启动历史记录时触发初始路由,则传递silent:true。

至于你的两个例子之间的区别:当你在第二种情况下启动Backbone的历史时,没有绑定任何路由,所以显然没有代码被执行。

修改
Successfully tested.
你会有警报。然后将Backbone.history.start()替换为Backbone.history.start({silent: true}),不会发生任何事情。

此外,深入研究Backbone.history #start:

if (!this.options.silent) return this.loadUrl();

所以...我不知道,但如果它不适合你,我猜我们需要更多的信息。

编辑2:
我在评论中改变了我告诉你的内容,this is the result。再一次,只需删除silent: true即可看到差异。