在指令控制器中,将函数添加到$scope和this之间有什么区别?

6
当学习egghead视频中指令间通信的内容时,建议我们使用控制器向'this'对象添加函数并从其他指令中访问它。
视频中使用的完整代码是:向this对象添加函数 相关的控制器代码如下:
controller: function($scope){
        $scope.abilities = [];
        this.addStrength = function(){
            $scope.abilities.push("Strength");
        }

        this.addSpeed = function(){
            $scope.abilities.push("Speed");
        }

        this.addFlight = function(){
            $scope.abilities.push("Flight");
        }
    },

我在想,为什么不将函数添加到$scope本身,尤其是当我们使用隔离作用域时?

向 $scope 添加函数的代码:向 $scope 添加函数

相关控制器代码如下:

controller: function($scope){
        $scope.abilities = [];
        $scope.addStrength = function(){
            $scope.abilities.push("Strength");
        };

        $scope.addSpeed = function(){
            $scope.abilities.push("Speed");
        };

        $scope.addFlight = function(){
            $scope.abilities.push("Flight");
        };
    },

或者为什么需要控制器函数呢?为什么不能使用链接函数来实现相同的结果?

在链接函数中向$scope添加功能:使用链接函数而不是控制器

相关的控制器和链接函数如下:

controller: function($scope){
        $scope.abilities = [];
        $scope.addStrength = function(){
            $scope.abilities.push("Strength");
        };

        $scope.addSpeed = function(){
            $scope.abilities.push("Speed");
        };

        $scope.addFlight = function(){
            $scope.abilities.push("Flight");
        };
    },

我相信使用控制器和对象有其合理的原因,但我无法理解为什么需要这样做。

1个回答

4
您说得对,您可以在link函数中公开函数并获得相同的结果。指令控制器有点奇怪,但是随着我编写更复杂的指令,我已经将尽可能多的行为推入控制器并将与DOM相关的内容留在link函数中。原因是:
  • 我可以传递控制器名称而不是在指令内部使用函数;我认为这样更清洁
  • 控制器可以公开用于兄弟或相关指令中的公共API,因此您可以进行一些互操作并鼓励SoC。
  • 如果需要,您可以将控制器测试与指令编译分离。

通常,只有当存在复杂的状态转换、处理外部资源(例如$http)或者需要重用时,我才会引入控制器。

您应该注意,Angular 1.2在指令上公开了“controllerAs”,使您可以直接在指令模板中使用控制器并减少$scope组合引入的一些仪式感。


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