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

Multiple Named Views in UI Router

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

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

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

我理解正确吗?

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

ui-router中,基本原理是将您的应用程序变成状态机。状态机的基本定义是,在任意时刻,只有一个state可以保持活跃。这实际上非常有用并且是一个很好的设计模式——从某种意义上说,您可以定义您的机器(或应用程序)在处于明确定义的状态时应该做什么(或者它应该如何表现)。也适合调试。

但是,这并不意味着在单一状态下,机器不能做多件事。只要处于那种状态,它就可以做很多事情。我们以一个电影预订应用程序为例。

免责声明:这不完全是真实状态图,但我们仅将其用于讨论目的。图片由 Google 搜索

提供

现在所有的蓝色圆角矩形框都是状态。意思是,当用户使用该应用程序时,在任何时间点,he/she 将处于其中一种状态 - 他必须,否则他不会使用该应用程序。

现在可以很快意识到,如果用户处于SeatsChoosing状态,他不能处于其他状态——不是PromotionSelection,不是 Payment,或其他州,同时 。他可以去其他状态(称为状态转换),比如说 PromotionSelection,但只有在他完成选择之后。关键是这里只有一个状态处于活动状态,也就是没有平行状态。一次只有一个。

虽然一次只能激活一个状态,但这并不意味着机器不能在一个状态下执行多个任务。以SeatsChoosing状态为例。在 SeatsChoosing 状态下,会执行多项任务,包括加载电影、获取位置、显示时间表等。但是只有在 SeatsChoosing 状态下,用户才会体验到所有这些事情。重点是您可以在一个状态下同时执行多个任务,只要您的状态定义允许即可。

而这正是 ui-router 正在实现的目标。在您的应用程序的任何时间点,您只能激活一个状态。嵌套状态本身仍然是一个单一的状态,它实际上只是一个沿着状态机向下遍历的节点——当你向下到达那个节点时,只有那个节点是活动的。不允许并行状态。同样的道理,这并不意味着你的状态不能同时做多件事。这就是 named views 的用途。对于一个状态,您可以有不同的视图,这些视图具有不同的明确定义的上下文(视图),它们都属于同一个域(状态)作为一个大伞。

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

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

希望对您有所帮助。