Я недавно видел такие ситуации:
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');
Я думаю, что это должно сработать, но это так странно возвращает пустой объект.
Я что-то упускаю?. Каков наилучший подход?
Просто не присоединяй это к 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() {
}
}]);