Избегайте утечки частных функций из контроллера AngularJS

0

Я недавно видел такие ситуации:

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", мы добавляем функцию к "этому" и сохраняем ссылку на это в себе, поэтому мы можем получить к ней доступ в функциях $ 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 ответ

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() {

    }
}]);
  • 0
    Огромное спасибо. Так очевидно, когда у вас есть ответ :-).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню