在控制器之间共享非单例状态(Angular Architecture)

Sharing non-singleton state between controllers ( Angular Architecture )

本文关键字:Angular Architecture 状态 单例 控制器 之间 共享      更新时间:2023-09-26

在我目前的公司,我们正在开发一个非常大的角度应用程序。争论的焦点之一是找出在控制器之间共享非单例状态的最佳方式。在理想的情况下,控制器共享一个恰好是单例的状态,我们可以将该状态建模为service,并通过inject使用该service在这些controllers之间进行通信

但是,我们希望拥有这个层次结构的多个实例,这意味着拥有一个singleton并没有帮助。我们需要的是一个基于上下文的singleton,它也可以是可注入的。

我们目前正计划通过指令层次结构来实现这一点,在该层次结构中,最高指令的控制器管理状态,然后所有较低指令require该控制器(用于指令到指令通信的指令控制器!)并调用其上的函数。这样做的问题是,所需的控制器只能在指令的链接函数中访问(这还不错,但由于大多数情况都会在这种状态下发生,所以测试起来会变得更困难。!链接函数比控制器更难测试。你可以直接注入控制器并测试它们。)。

我相信还有其他人可能会面临类似的情况,并想出一个令人满意的解决方案!

考虑这样的层次结构(例如)以更好地理解:

<post>
    <header></header>
    <button-array></button-array>
    <editor></editor>
    <footer></footer>
</post>
<post>
    <header></header>
    <button-array></button-array>
    <editor></editor>
    <footer></footer>
</post>

n根立柱,每米深。。

这里的例子是一个琐碎的例子,只深入DOM 1级。考虑一下,在应用程序中,我们有4-5级的深层指令。我们沿着隔离作用域的路线前进,并将所需的值传递到子指令中。这起到了作用,但感觉不对,主要是因为如果一个级别为5的指令需要一些东西——介于两者之间的所有指令都必须整理该数据(并公开一个范围变量,该变量除了将该值传递到下一级别之外什么都没做!这似乎很脆弱)。

如果你对如何解决这个问题有很好的建筑眼光,请告诉我们。如果你对什么有效或什么无效有任何建议,那也太好了。如果你知道解决这个问题的不同方法的相对优缺点,那也太好了。

如果我没有错的话,示例中的<post>元素有一些与它们相关联的状态对象,它们需要将其传递给<header>等等。

我通过在html级别将对象附加到scope来实现这一点。所以<post item="items[0]">,然后帖子模板中有<header item="item">等等。在隔离scope=type的情况下,更改在DOM树上下传播,因为它只是一个javascript对象,其中包含数据

您也可以使用指令控制器层次结构,但这意味着像<button-array>这样的东西在模板中出现的位置有点硬连接(如果您根据子指令在整个重复对象的DOM层次结构中的出现位置向下推或向上拉,则会断开它),而直接将状态传递到每个项中可以正常工作。

我只使用我称之为"模型状态"的东西来实现这一点,这些东西最终可能会发布到某个服务器上。帖子标题和内容、标记等。视图状态(对象的展开-折叠)在组件内部处理,并用于检测组件的边界(如果两个组件绑定紧密,需要访问彼此的视图状态,那么它们实际上是一个组件)。