有两个共享同一DOM元素的Angular控制器是一种不好的做法吗?

3

想象一下我有这样一个东西:

<html ng-app="myApp">
    ...
    <body ng-controller="GlobalController">
        <div id="one">...</div>
        ...
        <div ng-controller="SpecificController" id="subPart">
            <div id="two">...</div>
            ...
        </div>
        ...
    </body>
</html>

正如您所见,控制器GlobalController管理整个主体,而SpecificController仅控制subPart
在这种情况下,div#one可以访问GlobalController,但div#two链接到GlobalControllerSpecificController
我的问题是,这样做是否不好的实践,因为我想象中对于同一DOM元素(例如div#two)有2个控制器可能会导致冲突...
另外,如果这不是一个不好的实践,那么在这种情况下我应该注意什么呢?例如,我想象中必须小心避免在两个控制器中拥有相同的属性,对吗?
谢谢。
附:我不确定是否提过这个问题。我看到几次问题:“我可以在同一页中两次使用相同的控制器”,但那不是我的问题。
2个回答

4

在我看来,这没有任何问题,您只是展示了控制器之间存在“继承”链,这允许更加精细地控制与整个页面无关的DOM的某些方面。

您对共享属性的看法是正确的,子控制器将继承其父控制器的属性:

function ParentCtrl($scope) {
    $scope.test = "One";
}

function ChildCtrl($scope) {
    console.log($scope.test); // Logs "One";
    $scope.test = "Two"; // We've re-defined the variable as "Two"
}

然而,我会在代码中清楚地表明SpecificController确实继承自GlobalController,以避免数据属性的冲突。

事实上,我有一种感觉,我的 div#two 无法与 GlobalController 上的 $scope.foo 属性进行交互。我正在尝试创建一个 JsFidlle 来确保,并且我将编辑我的问题... - Romain Linsolas
为什么SpecificController应该继承自GlobalController - 它没有共享那个div#one - Bergi
@romaintaz div#two嵌套在GlobalController中,因此继承了任何已定义的属性 - http://jsfiddle.net/Yu8ZW/ - CodingIntrigue

0

我经常发现,如果您尝试将所有内容都保留在单个控制器中,特别是对于大页面,那么您的控制器大小可能会变得难以管理,因此我更喜欢使用父子控制器继承。只需记住,当从子DOM元素引用父属性时,您需要谨慎考虑您的父属性命名策略或在需要引用时在子DOM中使用$parent.parentproperty。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接