我有一个div代表我的html视图的正确区域.在那个div我有一个控制器,即
<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的“囚犯”,所以他们是与他们的母公司高度配合.
它看起来像一个God object反模式(在这种情况下是上帝控制器),所以我认为,而不是使用嵌套的控制器,我可以重构我的代码,以消除rightContainerCtrl控制器,并使用一个服务(像facade design pattern),那个服务将由控制器使用,而不是共享作用域变量.
但由于我不是AngularJs专家,我不知道我是对的,或者如果最好离开这位父母的控制人,也许我错过了一些事情,所以我的问题是
什么时候更好地使用嵌套的控制器(嵌套范围),而最好是在angularjs中使用服务?
在@ shaunhusain的回答中引用的视频中,Misko声明范围应该引用模型,而不是模型 – 所以不要将数据建模/放置到范围内.您的型号/数据通常应在服务中.
在写一个Angular应用程序时,首先考虑一下你的模型.将它们放在services with APIs中以获取/编辑/操纵模型.然后设计你的意见.每个视图都应该投射/使用/操纵你的模型的一些子集.为每个视图定义一个控制器,只需将所需的模型子集粘贴到视图中即可.使您的控制器尽可能薄.
(也不推荐命名一个控制器rightContainerCtrl.控制器不应该知道演示/布局.)