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

Jac*_*cob 0 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() {
    }
}]);
Run Code Online (Sandbox Code Playgroud)

附加到作用域的函数之间存在一些通用功能.由于我们需要对控制器的引用来访问'someCommonBehaviour',我们将函数附加到'this'并在self中存储它的引用,因此我们可以在$ 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');
Run Code Online (Sandbox Code Playgroud)

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

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

Jos*_*eph 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() {

    }
}]);
Run Code Online (Sandbox Code Playgroud)