【发布时间】:2012-01-22 23:08:17
【问题描述】:
有没有办法在backbone.js 中触发相同的位置路由,例如当位置为/My/App/#/About 并且用户再次单击具有相同路由的锚点以刷新页面内容时。
【问题讨论】:
标签: javascript routes backbone.js
有没有办法在backbone.js 中触发相同的位置路由,例如当位置为/My/App/#/About 并且用户再次单击具有相同路由的锚点以刷新页面内容时。
【问题讨论】:
标签: javascript routes backbone.js
Backbone.history.loadUrl(Backbone.history.fragment);
您的具体问题的解决方案并没有真正记录下来,似乎建议的最佳做法是只调用在您要触发的路由中声明的函数:/
参考:https://github.com/documentcloud/backbone/issues/1214
到目前为止,其他答案都是正确的,但他们忘记提及如果导航到的哈希与当前哈希相同,则不会触发任何内容。
【讨论】:
getFragment() 对于更现代的 Backbone 来说肯定是更合适的方法。但是,我会 +1 关于运行声明函数的评论,而不是试图欺骗路由器更新。
Backbone.Router 类可以接受一个对象,而不是 true/false,Router.navigate(Backbone.history.getFragment(), {trigger:true,replace:true}); 这将取代现有的导航(它在技术上已经这样做了,因为目标哈希是与当前哈希相同)
Router.navigate('about', true);
这样你就可以手动触发路由了。
【讨论】:
假设您想要执行此操作的不仅仅是关于页面,请使用:
route = Backbone.history.fragment;
yourRouter.navigate(route, true);
【讨论】:
由于 Backbone 路由器会在您要加载的 URL 片段中查找更改,因此对我有用的是首先导航到“/”而不触发,然后导航到您想要使用触发器触发的 URL(片段) .如果您愿意,您可以很容易地将其构建到默认路由器行为中。
例如
App.Routers.appRouter.navigate '/', {trigger: false}
App.Routers.appRouter.navigate myPath, {trigger: true}
【讨论】:
使用 Backbone 0.9.2,您传入一个选项对象并将 'trigger' 设置为 'true'。
router.navigate('some/route', { trigger : true });
参考:http://documentcloud.github.com/backbone/#Router-navigate
【讨论】:
另一个选项:你可以添加一个带有随机值的参数,这样每次调用的哈希值都会不同,即使你调用的是同一个页面。
【讨论】:
感谢@eddywashere 的建议,真的很棒。我添加了一个小编辑来检查您是否在最后一个(最新的)网址上,如果是,则加载该历史记录。很简单,认为它可能会对遇到相同问题的人有所帮助。
$("[data-href]").on("click", function(e) {
var href;
e.preventDefault();
href = $(e.currentTarget).data("href");
if ((_.last(this.history)) === href) {
return Backbone.history.loadUrl(_.last(this.history));
} else {
return this.router.navigate(href, true);
}
});
【讨论】:
router.navigate(route, {trigger: false}); // Changes URL but it will not trigger...Ex: In place of route -- 'about/1' or 'about' etc
Backbone.history.loadUrl(Backbone.history.fragment); // Changed route will be triggered here.
【讨论】: