在指令定义中指定控制器不会创建新作用域



我遇到了AngularJS指令的一个相当不直观的方面,我很好奇这种行为是否有合乎逻辑的原因。 当我在指令的定义中指定控制器时:

angular.module('MyApp.directives', [])
    .directive('myDirective, function () {
        templateUrl: "my-template.html",
        controller: "MyController"
    };
指令

模板的范围对于指令的所有实例都是相同的。

但是,如果我没有在指令的定义中指定控制器:

angular.module('MyApp.directives', [])
    .directive('myDirective, function () {
        templateUrl: "my-template.html"
    };

而是使用 ng-controller 直接在指令上定义控制器:

<my-directive ng-controller="MyController"/>

MyController的每个实例都接收其自己的子作用域。

我希望这些方法会产生相同的结果,但显然 Angular 根据控制器的声明方式对控制器的作用域进行了不同的处理。 这种差异有原因吗?

我相信,这样做的原因是指令作为定义是一个单例。因此,当您在单一实例的返回对象上输入控制器作为属性时,它将为所有实例共享。

但是,当您使用 ng-controller 定义标记时,ng-controller 指令会在每个元素上实例化该控制器,因此它会为每个指令实例创建一个新控制器(从而创建一个新作用域)。

最新更新