我正在使用Backbone.js开发非常基本的SPA。我的应用程序路由很少。其中有2个给我带来的问题:索引路由(“ /#index”)和菜单路由(“ /#mainmenu”)。
我的应用程序中的一个简单工作流程如下:用户填写一个表单->单击登录->触发ajax请求->如果登录成功,请转到“ /#mainmenu”路线。如果登录失败,请继续使用“ /#index”路由。
如果用户单击注销-> ajax请求->如果注销成功,则在“ /#mainmenu”上转到“ /#index”。如果注销失败,请保留在“ /#mainmenu”上。
我正在努力解决的问题是:
一种成功登录后触发转换到“ /#mainmenu”的干净方法(我目前使用router.navigate(“ mainmenu”,{trigger:true});但是在derrick bailey的文章https://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/中,应避免使用这种方法)
一种防止用户从“ /#mainmenu”路径按浏览器中的“后退”按钮时返回到“ /#index”的干净方法。我还要保留url哈希以反映当前视图。
成功注销后,防止用户前进到“ /#mainmenu”。
在单击浏览器的后退/前进按钮时,是否还可以防止url哈希更改?
当我说“干净”时,我指的是“最佳实践是什么?”。我通过保存url哈希并恢复适当的哈希值(通过router.navigate(currentRoute,{replace:true});)部分解决了一些问题,但是我觉得这是一种骇人听闻的方法。
欢迎任何反馈,不胜感激。
最佳答案
解决此问题的一种方法是在执行实际的回调路由之前,在需要进行身份验证状态检查的路由上应用异步before
过滤器。
例如:
https://github.com/fantactuka/backbone-route-filter
避免{trigger: true}
的原理是基于以下事实:当路由器使用此标志触发时,将触发该路由的整个初始化过程。您将失去先前定义的应用程序状态的好处,因为在之前做完这项工作之前,应用程序必须重新初始化所有内容。
在实践中,我认为评估您的Web应用程序实际执行的操作很有用。如果因为要渲染的视图是全新的视图而导致失去应用状态不是一个问题,那么我认为在创建客户端重定向以重新初始化您的应用时不会出现问题。
另一方面,如果您的应用程序有许多已经渲染的视图,并且您想要保持与以前相同的状态,则可以在需要它的每个组件上侦听auth状态事件,并仅使这些视图相应地重新渲染如果他们需要的话。
关于javascript - Backbone js防止在前进/后退时更改URL哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31513138/