是否可以在同一元素上应用多个AngularJS控制器

far*_*oft 31 javascript angularjs

是否可以在同一元素上应用多个AngularJS控制器?

Man*_*ube 34

,您不能将两个控制器应用于同一元素,但您可以应用多个指令.指令可以有控制器.

app.directive('myDirective1', function() {
return {
controller: function(scope) {
  //directive controller
  }
 };
});

app.directive('myDirective2', function() {
return {
controller: function(scope) {
  //directive controller
  }
 };
});
Run Code Online (Sandbox Code Playgroud)

在HTML中:

<div myDirective1 myDirective2></div>
Run Code Online (Sandbox Code Playgroud)

正如下面的评论中所提到的,两个控制器可以共享相同的范围,这通常是期望的效果; 两个控制器中的一个可以请求一个新的范围,但是你不能有两个新的范围;

不允许在两个指令上使用两个隔离范围的原因是,如果范围变量在两个隔离的指令控制器中具有相同的名称,则视图将不知道从哪里获取范围值

这是一个有趣的读物:为什么多个指令不能在同一个元素上要求隔离范围?


Kel*_*ode 31

您可以扩展控制器并在任何您喜欢的地方使用它.请参阅小提琴以获得更好的示例.

<script>
var multiApp = angular.module('new', []);

multiApp.controller('aCtrl', ['$scope', '$controller', function ($scope, $controller) {
  $scope.text1 = 'Hello';

  angular.extend(this, $controller('bCtrl', {$scope: $scope}));
}]);



multiApp.controller('bCtrl', ['$scope', function ($scope) {
                $scope.text2 = 'World!';
}]);
</script>
Run Code Online (Sandbox Code Playgroud)

用html像:

<body ng-app="new">
    <div id="container1" ng-controller="aCtrl">
        {{text1}} {{text2}}
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/kkelly/thk9n20o/#base.com

  • 我发现这非常有用,因为它基本上允许同一元素上的多个控制器.我的目的只是在分享范围时分解控制器以进行组织,这对于此非常完美. (3认同)

Dav*_*ica 8

没有

HTML是XML的一种形式,在同一元素上具有多个非唯一属性是无效的xml.换一种说法,

<div ng-controller="a" ng-controller="b">
Run Code Online (Sandbox Code Playgroud)

是无效的.但是当我们这样做的时候呢

<div id="a" ng-controller="a">
    <div id="b" ng-controller="b">
        <div id="c">
Run Code Online (Sandbox Code Playgroud)

有效的xml/HTML,它不会将两个控制器分配给divwith id c.这称为嵌套控制器.