Angular-ui Router会并行地激活两个状态



我需要并行使用两个状态,一个用于我的页面,另一个用于具有多个子状态的模态。现在调用模式状态会清除我的页面,因为页面状态改变了。

为我的页面创建一个子状态子将不是一个解决方案,因为模态将在几个页面上使用。

的例子:

$stateProvider
.state('user', {}) // page
.state('bookshelf', {}) // page
.state('books', {}) // modal
.state('books.read', {}) // sub state of modal

所以如果我在user上打开我的模态,那么状态将改变为books,我的模态将有内容,但页面内容将被删除。

我该如何修复它?

我相信你想要做到这一点的方式是不可能的UI。目前路由器。你所描述的是一个模态组件(理想情况下写成一个指令),它独立于主状态跟踪它的状态。

考虑它的方式是,UI。路由器通过创建一个状态树来工作。在任何给定时间,你只能看到树的一个分支。你可以深入到一个分支(如:book, book.open, book.open.checked),但你不能同时在两个地方。

上面问题的另一个问题是如何将两个不同树的状态序列化到一个url中?这并不是说做不到,只是一个很难解决的问题。

检查这些问题:

  • 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/475

也签出这些repos,它们可能会进一步解决问题。

  • https://github.com/afterglowtech/angular-detour
  • https://github.com/stu-salsbury/angular-couch-potato

就解决您的直接问题而言,我认为"最简单"的方法是在状态配置中放弃控制模态的状态。

相反,我会添加某种根或抽象状态,然后跟踪模态是否在那里打开。然后,您可以使用事件在控制器之间进行通信,如下所示。注意:听$rootScope是有性能影响的,所以一定要研究一下。然而(有人可以随意纠正我),这里的实现没有这些问题,因为AppCtrl从未被销毁。


2015年1月15日编辑

这是一个非常流行的用例,UI Router的核心贡献者之一维护了一个名为UI Router Extras的插件/附加

它还包括用于延迟加载的实用程序,称为"未来状态",这非常有用。

话虽这么说,我希望有时间做的一个特性是维护URL(或者本地存储)中的所有状态,并允许可重用的状态"组件"。

最新更新