UI路由器中的多个命名视图

时间:2017-01-04 04:34:32

标签: angularjs angular-ui-router controllers

我问这是为了确保我理解这个概念。在UI路由器中,他们建议您尽可能使用嵌套状态。但是,当您这样做时,每个州/视图只能有1个控制器。在大多数情况下,这很好。但是,如果在状态/视图上需要两个或更多控制器,则Multiple Named Views似乎是正确的解决方案。因为看起来你实际上可以拥有不同的html元素或由不同控制器控制的div - 如果有必要的话。

因此,例如在搜索结果页面上,您可以在由不同控制器控制的页面上具有不同的元素或div ....这是UI路由器中的多个命名视图的设计目的吗?

对于更复杂的页面,如搜索结果页面,多命名视图似乎比简单的嵌套状态更好...因为你可以有一个身份验证控制器,自动完成控制器,搜索控制器 - 所有人都负责不同的页面上的区域。我甚至不确定你是如何使用嵌套状态来完成类似的事情。

我正确理解这一点吗?

1 个答案:

答案 0 :(得分:2)

我认为您对viewsstates的基本定义感到困惑。话虽这么说,你的理解(对你自己的问题陈述)是正确的。

ui-router中,它的基本原则是将您的应用程序变为状态机。状态机的基本定义是,在任何时间点,只有一个state可以保持活动。这实际上非常有用并且是一个很好的设计模式 - 从某种意义上说,当您处于明确定义的状态时,您可以定义您的机器(或应用程序)应该执行的操作(或应该如何操作)。也适合调试。

然而,这并不意味着在单一状态下,机器不能做多件事。它可以,只要在那个州,它的工作就是做多件事。我们以电影预订应用为例。

enter image description here

免责声明:这不是一个真正的状态图,但我们可以将它用于讨论目的。图片由Google搜索提供

现在所有蓝色圆角矩形框都是状态。这意味着,当用户使用该应用程序时,他/她将处于其中一个状态 - 他必须,或者他没有使用该应用程序。

现在可以很快意识到,如果用户处于SeatsChoosing状态,他不能处于其他状态 - 不是PromotionSelection,而不是{{1} }或其他状态,同时。他可以去其他州(称为州过渡),说Payment,但只有在他做出选择之后。关键是这里只有一个州没有活动,也就是没有并行国家。一次只有一个。

虽然它一次只能激活一个状态,但这并不意味着机器无法在单个状态下执行多个任务。以PromotionSelection状态为例。在SeatsChoosing状态下,执行多个任务,包括加载电影,获取位置,显示日程安排等。但是,只有当用户处于SeatsChoosing状态时,用户才会体验所有这些事情。关键是你可以在一个状态下同时执行多个任务,只要你的状态定义允许它。

这正是SeatsChoosing正在实现的目标。在您的应用程序的任何时间点,您只能激活一个州。嵌套状态本身仍然是单个状态,它实际上是一个遍历状态机的节点 - 当您到达该节点时,只有该节点处于活动状态。不允许并行状态。出于同样的原因,这并不意味着您的州一次不能做多件事。这就是ui-router的用途。对于某个州,您可以拥有不同的视图,这些视图具有不同的明确定义的上下文(视图),所有这些视图都属于同一个域(州)和大伞。

现在让我们回到您的搜索结果问题陈述。您如何定义您的州,以及如何定义您的观点?这完全取决于您,但只是确保您使用named views,您遵守状态机的规则 - 即没有并行状态但允许并行任务。因此,如果您定义一个状态是一个执行多项操作的页面 - 身份验证,自动完成等,那么是多个命名视图是正确的方式而不是嵌套状态。但是,如果您将ui-routersearch分隔为两个不同的域,那么嵌套状态可能会更好。

对此没有正确和错误的答案,只是设计决定的问题。

希望有所帮助。