在angularjs中何时使用嵌套控制器而不是服务?

在angularjs中何时使用嵌套控制器而不是服务?,angularjs,anti-patterns,god-object,Angularjs,Anti Patterns,God Object,我刚开始使用AngularJS,所以我不是专家 我有一个div代表我的html视图的正确区域。在那个分区我有一个控制器,即 <div class="rightContainer" ng-controller="rightContainerCtrl">...</div> 。。。 在该div内,我有一个表、一个搜索区域等。该div内的每个区域都有自己的控制器,如下所示: <div class="rightContainer" ng-controller="right

我刚开始使用AngularJS,所以我不是专家

我有一个div代表我的html视图的正确区域。在那个分区我有一个控制器,即

<div class="rightContainer" ng-controller="rightContainerCtrl">...</div>
。。。
在该div内,我有一个表、一个搜索区域等。该div内的每个区域都有自己的控制器,如下所示:

<div class="rightContainer" ng-controller="rightContainerCtrl">
...
   <div class="search" ng-controller="searchCtrl">...</div>
...
   <div class="table" ng-controller="tableCtrl">...</div>

 </div>

...
...
...
...
例如,搜索区域有自己的控制器,它是rightContainerCtrl的子级,因为它需要更改父级(rightContainerCtrl)中的某些内容,但rightContainer div正在增长,现在它变大了,并且包含多个嵌套的控制器

我认为使用这种嵌套控制器在这种情况下是不好的,因为所有嵌套控制器共享父作用域,并且不是所有控制器都需要访问所有父作用域变量,而且所有控制器都是rightContainerCtrl的“囚徒”,因此它们与父控制器高度耦合

它看起来像一个反模式(在本例中是上帝控制器),因此我认为我可以重构代码来消除rightContainerCtrl控制器,并使用一个服务(如在a中),然后控制器将使用该服务,而不是共享作用域变量

但由于我不是AngularJs专家,我不确定我是否正确,或者离开这个父控制器是否更好,也许我遗漏了什么,所以我的问题是


在angularjs中,何时使用嵌套控制器(嵌套作用域)更好,何时使用服务更好?

这是100%的判断调用,应该基于两点

使用事件可以创建非常松散耦合的组件,它们实际上不需要相互了解,如果您遇到这样的情况,即某个父控制器可以减少在一组控制器(通过服务)之间通信的需要,那么这可能是一个更好的解决方案

但是,如果您对每个控制器都满意,这取决于服务(这不是一个真正的问题),那么您可以使用服务作为在控制器之间通信更改的一种方式。我已经看到很多反对singleton的论据(服务是一种风格,注入了singleton,但singleton仍然存在),我发现这些论据大多没有实际意义,通常缺乏真正优雅简洁的解决方案。如果一个争论不断地谈论,当你从A-D出发时,你不想走B路,但他们似乎从来没有提供C路,我真的不明白这一点


我在视频中找不到确切的要点,但在最后的某个地方,他讨论了控制器与服务的使用(他还回顾了双向数据绑定,可以说这将阻止您污染全局范围)。

控制器/范围层次结构不应规定如何在应用程序中共享数据/模型。当您考虑角度数据共享时,请考虑依赖注入

在@shaunhusain的answser中引用的视频中,Misko指出作用域应该引用模型,而不是模型——所以不要建模/将数据放入作用域中。您的模型/数据通常应在服务中

在编写Angular应用程序时,首先考虑您的模型。将它们放入以获取/编辑/操作模型。然后设计您的视图。每个视图都应该投影/使用/操作模型的某些子集。为每个视图定义一个控制器,该控制器仅将所需的模型子集粘贴到视图。使控制器尽可能薄


(也不建议命名控制器
rightContainerCtrl
。控制器不应该知道演示文稿/布局。)

谢谢您的回答,事实上控制器不应该知道演示文稿,所以从这个意义上说,仅仅因为视图需要一个div层次结构,这并不意味着控制器需要嵌套,因为它们应该解耦/独立于视图。此外,如果您有一个控制器和一组子控制器,可能是您使用父控制器范围作为模型,这是一种不好的做法,在这种情况下,需要一个服务,不是家长管制员。谢谢分享视频,我看了,现在我对AngularJs有了更好的了解。MarkRajcok在他们的回答中暴露了一个好的观点,视频也解释了这一点。您应该为您的模型使用服务,并且您的模型需要与控制器和作用域解耦,因此在我的示例中,rightContainerCtrl是模型,因为多个嵌套的控制器正在使用该作用域中的变量,但这是一种不好的做法,它应该是一种服务。@MiguelA.Carrasco是的,很高兴你也从视频中得到了一些东西。最近我在这里多次推荐它,因为它似乎涵盖了许多常见的错误。我也理解了马克的答案,他解释得很好,还有很多其他非常好的答案。编写事件来在控制器之间进行通信确实是一件痛苦的事情。我宁愿使用嵌套的作用域。或服务。