在AngularJS中使用嵌套控制器是否正确,何时不是?

时间:2013-09-05 22:11:39

标签: design-patterns angularjs

我是AngularJs的初学者,所以也许我错过了一些重要的东西,但我认为如果我们想在控制器之间共享信息,我们可以改用服务,不是吗?

控制器不应该知道视图(html),但如果你认为,当我们使用这样的嵌套控制器时:

<div ng-controller="ControllerA">
...
   <div ng-controller="ControllerB"> 
   ...
   </div>
</div>

如果ControllerB使用ControllerA范围,那么我们只是将ControllerB与ControllerA和视图(html)耦合,因为这里的html决定了控制器中范围的层次结构,如果我们想要改变所有的html,例如,一个新的设计,html结构改变如下:

<div ng-controller="ControllerA">
...
</div>

<div ng-controller="ControllerB">
...
</div>

然后视图中的这个变化也会影响我们的ControllerB逻辑(因为它使用了ControllerA范围),所以对我来说,AngularJS中的嵌套控制器看起来像一个反模式,但也许我错过了什么,所以...

在AngularJs中使用嵌套控制器是否正确,何时不使用?

你能给我一些用例吗?

由于

1 个答案:

答案 0 :(得分:1)

在您的示例中,控制器层次结构是HTML布局的副作用,这是真的。

然而,我可以想到两次它是函数固有的。一个是例如ng-repeat指令。子作用域继承自父作用域,这是正确的,因为您希望父作用域将子控件作为一组控制。

第二个是逻辑单位。换句话说,如果我正在为产品构建一组页面,我可能会创建一个父产品控制器,然后创建子控制器来选择产品,添加产品,删除产品。这是一种独立于视图实现的逻辑关系。但是,这样做是有道理的,因为现在我可以通过多种方式设置我的UI而不会产生副作用。例如,也许我默认使用带有列表的网格视图,然后使用路由转换到详细信息视图 - 这将起作用。或者我可能决定将选择放在同一页面的左侧,右侧的详细信息 - 同样的事情也可以。我可以测试和协调这些控制器,但是虽然我有逻辑继承,但它并没有对UI的实现方式施加层次结构。

如果我有不相关的控制器,但有一个共同的“全局关注点”或我们称之为“方面”的话,那么我将使用服务,而不是担心控制器层次结构处理与该服务的交互。