避免从AngularJS控制器泄漏私有函数

时间:2016-04-27 17:04:41

标签: javascript angularjs

我最近看到过这样的情况:

app.controller('MainCtrl', ['$scope', 'MyService', function($scope, MyService) { 
    $scope.name = 'World';
    var self = this;

    $scope.operationOne = function() {         
        MyService.sayHello(); 
        self.someCommonBehaviour(); 
    }

    $scope.operationTwo = function() {     
        MyService.sayGoodbye(); 
        self.someCommonBehaviour(); 
    }

    this.someCommonBehaviour = function() {
    }
}]);

在提取到函数的作用域附加的函数之间存在一些通用功能。因为我们需要一个控制器的参考来访问“someCommonBehaviour'我们将该功能附加到“这个'并在self中存储this的引用,因此我们可以在$ scope函数中访问它(这在范围内是调用函数时生效的范围)。

作为' someCommonBehaviour'可以从外面访问(ctrl.someCommonBehaviour())。 我认为,至少在我看到的情况下,意图显然是将这些功能作为控制器的私人关注可以访问它们的事实是一个意外

此外,我已经看到程序员试图在已经很复杂的控制器中添加更多逻辑的情况,他们陷入了测试这些功能的诱惑,这是你不应该做的事情。

我正在寻找阻止从外部访问这些功能的方法。

我在考虑IIFE,因为它们允许您控制将定义模块的公共API的函数(这是我为服务选择的实现)。我为这种情况所需的唯一API是由我添加到作用域的函数定义的,这感觉很奇怪。所以,你会有类似的东西:

(function(module) {
    var controller = function($scope, MyService) {
        $scope.methodOne = function(
        ...
        ...
        return { }
    };
    module.controller('controller', ['$scope','MyService',controller]);
})(angular.module('app');

我认为它应该可行,但返回一个空物体感觉很奇怪。

我错过了什么吗?什么是最好的方法?

1 个答案:

答案 0 :(得分:6)

请勿将其附加到this。只有控制器内部的代码才能看到它。

app.controller('MainCtrl', ['$scope', 'MyService', function($scope, MyService) { 
    $scope.name = 'World';
    var self = this;

    $scope.operationOne = function() {         
        MyService.sayHello(); 
        someCommonBehaviour(); 
    }

    $scope.operationTwo = function() {     
        MyService.sayGoodbye(); 
        someCommonBehaviour(); 
    }

    // Not accessible outside controller
    function someCommonBehaviour() {

    }
}]);