Backbone.history.navigate(url, {trigger:true, replace: true})

10
我使用了这种方法来导航到url,触发事件并且不将url添加到浏览器历史记录中。但是Backbone.history.navigate(url,{trigger:true, replace: true})会替换掉历史记录中之前的url。 例如:浏览器历史记录

之前:

localhost:port/url

Backbone.history.navigate(url + '/list',{ trigger:true, replace: true })

预期结果:在路由url + '/list'上触发事件,并且浏览器历史记录为 localhost:port/url

实际结果:事件被触发,但浏览器历史记录变成了localhost:port/#url/list。之前的url被替换了。


2
问题出在URL中的#吗?这个问题不是很清楚。 - fearphage
1
看起来下面的答案应该被接受为正确的答案,请注意您似乎误解了 replace 的含义---它替换的是“历史”中的条目(地址栏在导航时始终发生变化)... 但导航并不是更新应用程序的唯一方式! - Corin
1个回答

15

以下是我认为您在问什么,请纠正我如果我错了:

"如何在Backbone中触发一个路由而不更新URL?"

快速回答:

你做不到。选项replace也无法帮助你。以下是文档中的代码片段:

要更新URL而不创建浏览器历史记录条目,请将replace选项设置为true

正如您所看到的,replace不会影响URL的更新。

后续回答:

如果您不想更新URL,则这让我想到在您的应用程序中显示列表不是对应用程序状态的主要更新。如果是这样,在我的经验中,您不应该使用Backbone.history对象来进行管理。

如果您直接调用此功能(例如通过函数)或间接调用它(例如通过调度事件),则您的应用程序将会更新,而您的URL则不会。

我很喜欢Derick Baily的帖子,讲述如何设置路由器结构。虽然有点冗长,但值得一读。
此外,看看David Sulc的存储库,里面有"Marionette的简单介绍"。我知道它使用了Marionette.AppRouter对象,但原则仍然是正确的。查看此文件获取示例。
作为一个附注,如果 # 是问题的话,请查看 这个SO答案。但要注意,hashChange 选项主要是为了跨浏览器兼容性,根据文档所述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接