【发布时间】:2012-06-26 10:43:40
【问题描述】:
Backbone.js 为其 Backbone.router 对象提供了一个 navigate(fragment, [options]) 方法,该方法执行以下操作(根据文档):
每当您在应用程序中到达想要另存为 URL 的点时,请调用
navigate以更新 URL。如果您还想调用路由函数,请将trigger选项设置为true。要更新 URL 而不在浏览器历史记录中创建条目,请将replace选项设置为true。
因此,简单地调用appRouter.navigate('page'); 可能会将URL 更改为www.myapp.com/page 而不会触发相应的路由。但是,我发现我的路由器重定向到 URL 并且还触发了页面路由,尽管默认情况下trigger=false。
因此,以下代码:
$(function(){
var AppRouter = Backbone.Router.extend({
routes: {
'': 'home',
'page': 'page',
},
home: function() {
window.app.navigate('page', {replace: true});
console.log('home route');
},
page: function () {
console.log('page route');
},
});
window.app = new AppRouter();
Backbone.history.start({pushState: true});
});
导航到 www.myapp.com 时产生以下控制台输出:
> home route
> page route
当预期的控制台输出应该是:
> home route
该方法似乎违反了默认的trigger 选项。这是实现中的错误,还是我误解了什么?
【问题讨论】:
-
它与
trigger: false设置是否正常工作? -
@jakee:不,
window.app.navigate('page', {trigger: false, replace: true});仍然产生相同的行为。和window.app.navigate('page');一样。 -
从
Backbone.history.start中去掉pushState: true,然后用原来的navigation 调用试试。我用谷歌搜索了一下,pushState: true和navigate之间可能存在联系,无法正常工作。 -
做到了。它正确导航到#page,同时仅触发主路由。谢谢!不过,我真的很想将它与
pushState: true一起使用。这实际上是实现中的错误吗? -
我不知道,从 2011 年开始,我的谷歌搜索对此只产生了模糊的评论,我不得不自己修补它。我认为这与 js history api 中的 pushState 实现有关。但我会添加一个答案,如果你愿意,你可以接受。
标签: jquery backbone.js backbone-routing