如何管理应用程序和URL中的状态
How to manage state in application and URL?
我正在构建一个web应用程序,通过内部和URL管理状态,允许用户使用浏览器按钮以及网站的UI操作状态。
我使用jQuery-BBQ来管理URL哈希,并且我有一个hashchange处理程序,当URL发生变化时相应地改变事情(例如浏览器按下后退/前进按钮)。然而,事情本身也发生了相应的变化,最终会改变哈希值,从而触发hashchange处理程序并导致循环。
为了解决这些情况,我发现自己检查新状态是否与前一个状态相同,如果是,则退出。但我很快就得到了相当复杂的代码,分别处理每个状态,并在每个状态上操作多个参与者。
是否有一种设计模式可以优雅地处理这种状态管理场景?我现在不能推荐任何具体的设计模式来实现,但我可以建议你看看html5的pushSate()和popState()函数。这些函数能够存储状态以及与这些状态相关联的数据。Github.com使用这种技术来遍历某个公共存储库的目录。这里有一个快速指南:https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history。
我最终做的是严格地在我的程序中只提供一个可以更改状态的地方,并通过该地方路由所有状态更改。
这里的"一个地方"是指一组可公开访问的函数,它们的工作包括:
- 验证请求的状态更改
- 正在验证新请求的状态更改与当前状态不同
- 更新应用程序状态
- 更新浏览器状态
步骤2可能是最重要的——它确保状态更改请求是来自应用程序内部还是来自浏览器,在初始更改之外,不会有任何重复尝试更改应用程序或浏览器中的状态。
到目前为止都很好,这似乎将状态机的复杂性封装在我的一部分代码中,使其更容易保持直接…不过,我欢迎任何其他答案。我敢肯定这个问题已经被解决过很多次了。
相关文章:
- 使用应用程序状态js和视图在angular js url上传递两个参数
- 使url匹配'/''/索引'和'/index.html'到单一状态
- 如何同步Redux状态和url哈希标记参数
- 限制与AngularJS状态匹配的动态URL参数的最佳方式
- 在AngularJS ui路由器中,状态已更改,url已更改,但模板url未更改
- URL中包含特殊字符的HTTP状态代码
- Angular ui路由器,通过url/url变量保存状态
- 将状态的 URL 数据获取到模板中
- Angular ui路由器单元测试(状态为url)
- AngularUI路由器-无法通过URL访问状态
- Ember.js URL如何表示所有可能的路由器状态
- 可以't使用URL导航到ui路由器状态
- 使用url字符串更改js/jquery的状态
- 当鼠标悬停在链接上时,从 href URL 中隐藏状态栏值
- 更改自动滚动的 URL(推送状态?
- AngulaJS ui路由器:路由到url状态
- goBack按钮,同时使用react路由器保留url状态
- AngularJS-处理手动输入URL状态的最佳方式
- 无法加载http://url状态:0"onbeforeunload方法出错
- 如何为多个 url 状态设置仅使用反应路由器激活一个链路