Router#navigate
我认为,对于究竟做什么似乎有些困惑。
如果没有设置任何选项,它会将 URL 更新为提供的片段。例如,router.navigate('todo/4/edit')
将URL 更新为#todo/4
AND 将为该 URL创建一个浏览器历史记录条目。没有运行路由处理程序。
但是,设置trigger:true
会更新 URL,但它也会运行为该路由指定的处理程序(在 Addy 的示例中,它将调用 routerseditTodo
函数)并创建浏览器历史记录条目。
传递replace:true
url 时将更新,不会调用任何处理程序,但不会创建浏览器历史记录条目。
那么,我认为答案是:
不鼓励使用 的原因trigger:true
很简单,从应用程序状态导航到应用程序状态到应用程序状态与直接导航到特定应用程序状态相比,大多数情况下需要运行不同的代码。
假设您的应用程序中有状态 A、B 和 C。但是状态 B 建立在状态 A 之上,而状态 C 建立在 B 之上。在这种情况下,当您从 B 导航到 C 时,只需要执行特定部分的代码,而当直接到达状态 C 时,可能会执行一些状态检查和准备:
- 该数据是否已加载?如果没有,请加载它。
- 用户登录了吗?如果不重定向。
等等
举个例子:State A ( #list
) 显示歌曲列表。状态 B ( #login
) 是关于用户认证,状态 C ( #list/edit
) 允许编辑歌曲列表。
因此,当用户到达状态 A 时,歌曲列表被加载并存储在一个集合中。他单击登录按钮并被重定向到登录表单。他成功验证并被重定向回歌曲列表,但这次歌曲旁边有删除按钮。
他为最后一个状态添加了书签 ( #list/edit
)。
现在,当用户在几天后点击书签时需要发生什么?应用程序需要加载歌曲,需要验证用户(仍然)登录并做出相应的反应,状态转换流程中的内容已经在其他状态下完成。
现在来做一个我自己的笔记:
我绝不会像示例中那样在实际应用程序中推荐上述方法。您应该检查从 B 到 C 时是否加载了集合,而不仅仅是假设它已经加载。同样,您应该检查用户是否确实已登录。这只是一个示例。
IMO 路由器确实是一种特殊的视图(想想看,它显示应用程序状态并将用户输入转换为应用程序状态/事件)并且应该始终这样对待。您永远不应该依赖路由器在状态之间转换,而是让路由器反映状态转换。