1

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

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
    });
    }

});

另一方面,如果我删除 ,,home" 和 ,,about" 方法并以这种方式编写它们,它们不会在第一次加载时执行。但这两者之间的实际区别是什么?是否可以像第一个示例那样编写代码,但要防止在第一次加载时执行?

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

谢谢大家的回答...

4

1 回答 1

3

来自Backbone 的文档
如果服务器已经渲染了整个页面,并且您不希望在启动历史记录时触发初始路由,请传递静默:真。

至于您的两个示例之间的区别:当您在第二种情况下启动 Backbone 的历史记录时,没有绑定任何路由,因此显然没有执行任何代码。

编辑:
成功测试。
你会有一个警报。然后替换Backbone.history.start()Backbone.history.start({silent: true}),什么都不会发生。

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

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

所以...我不知道,但如果它对你不起作用,我猜我们需要更多信息。

编辑2:
我已经改变了我在评论中告诉你的内容,这就是结果。再一次,只需删除silent: true即可查看差异。

于 2013-04-02T12:50:03.730 回答