我需要并行使用两种状态,一种用于我的页面,另一种用于具有多个子状态的模式。
现在调用模态状态将清除我的页面,因为页面状态发生了变化。
创建我的页面的子状态子级不是解决方案,因为模式将在多个页面上使用。
Example:
$stateProvider
.state('user', {}) // page
.state('bookshelf', {}) // page
.state('books', {}) // modal
.state('books.read', {}) // sub state of modal
所以如果我在user
并打开我的模式,然后状态将更改为books
,我的模态将具有内容,但页面内容将被擦除。
我如何解决它?
我相信目前 UI.Router 无法实现您想要的方式。你所描述的是一个模态成分(理想情况下,可以将其编写为指令),它独立于主状态来跟踪其状态。
思考这个问题的方法是,UI.Router 通过创建状态树来工作。在任何给定时间,您只能看到树的一个分支。您可以深入分支(即:book
, book.open
, book.open.checked
),但你不能同时出现在两个地方。
上述问题的另一个问题是如何将两个不同树的状态序列化到一个 url 中?并不是说做不到,只是一个很难解决的问题。
检查这些问题:
- https://github.com/angular-ui/ui-router/issues/119 https://github.com/angular-ui/ui-router/issues/119
- https://github.com/angular-ui/ui-router/issues/384 https://github.com/angular-ui/ui-router/issues/384
- https://github.com/angular-ui/ui-router/issues/475 https://github.com/angular-ui/ui-router/issues/475
另请查看这些存储库,它们可能会进一步解决问题。
- https://github.com/afterglowtech/angular-detour https://github.com/afterglowtech/angular-detour
- https://github.com/stu-salsbury/angular-couch-potato https://github.com/stu-salsbury/angular-couch-potato
至于解决您眼前的问题,我认为“最简单”的方法是放弃控制状态配置中模态的状态。
相反,我会添加某种根或抽象状态,然后跟踪模式是否在那里打开。然后,您可以使用事件在控制器之间进行通信此处显示 http://jsbin.com/donisogi/3/edit。注:有性能影响 https://github.com/angular/angular.js/issues/4574与听$rootScope
,所以一定要研究这些。然而(有人随时纠正我),这里的实现没有这些问题,因为AppCtrl
永远不会被摧毁。
2015 年 1 月 15 日 编辑
事实证明这是一个非常流行的用例,UI Router 的核心贡献者之一维护了一个名为的插件/附加组件UI 路由器附加功能 https://github.com/christopherthielen/ui-router-extras
它还包括用于延迟加载的实用程序,称为“未来状态”,这非常有帮助。
话虽这么说,我希望花时间研究的一个功能是维护 URL(或者可能是本地存储)内的所有状态并允许可重用状态“组件”。后者也在 UI Router 路线图中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)