Передача текущей области в Службу AngularJS
правильно ли передавать "текущий"$scope
к службе AngularJS?
Я нахожусь в ситуации, когда у меня есть $service, зная, что он потребляется только одним контроллером, и я хотел бы иметь ссылку на область контроллера в самих методах $service.
это философски исправить?
или мне лучше транслировать события в $rootScope, а затем заставить мой контроллер слушать их?
4 ответа:
чтобы контроллер знал, когда происходит что-то асинхронное, используйте Угловое обещания.
чтобы спровоцировать
$apply
, вам не нужен объем, вы можете вызвать$rootScope.$apply
, так как нет никакой разницы, называя его в определенной области или в корне.Что касается чтения переменной, было бы лучше, если бы вы получили параметры. Но вы также можете прочитать его из области как параметр объекта, но я бы пошел с параметром, который сделает ваш интерфейс службы гораздо яснее.
Я бы сказал, Если ваша функциональность специфична только для одного контроллера, чем вам не нужен сервис.
задачи контроллеров-манипулировать конкретной моделью, тогда как служба должна иметь дело с глобальными задачами. Я бы предпочел придерживаться этой парадигмы вместо того, чтобы смешивать вещи.
вот что говорят врачи
сервис
угловые сервисы-это синглеты, которые выполняют определенные задачи, общие для web приложения
контроллер
в Angular контроллер-это функция JavaScript (тип/класс), которая используется для увеличения экземпляров угловой области, исключая корневую область.
PS: кроме того, если вам нужно переварить вы также можете ввести $rootScope в вашем сервисе.
да. Вы можете передать $scope в службу при ее инициализации. В конструкторе службы вы можете назначить область для чего-то вроде этого._scope, а затем ссылаться на область внутри службы!
angular.module('blah').controller('BlahCtrl', function($scope, BlahService) { $scope.someVar = 4; $scope.blahService = new blahService($scope); }); angular.module('blah').factory('blahService', function() { //constructor function blahService(scope) { this._scope = scope; this._someFunction() } //wherever you'd reference the scope blahService.prototype._someFunction = function() { this._scope['someVar'] = 5; } return blahService; });
я лично считаю, что передает
$scope
для службы это плохая идея, потому что он создает своего рода циклическую ссылку: контроллер зависит от службы, а служба зависит от области действия контроллера.помимо путаницы с точки зрения отношений, такие вещи, как этот, в конечном итоге мешают сборщику мусора.
мой предпочтительный подход-поставить домен объекта в области контроллера и передайте на службу. Таким образом, служба работает независимо от того, используется ли она внутри контроллера или, возможно, внутри другой службы в будущем.
например, если служба должна выталкивать и всплывать элементы из массива
errors
мой код будет такой:var errors = []; $scope.errors = errors; $scope.myService = new MyService(errors);
служба взаимодействует с контроллером, работая на
errors
. Конечно, я должен быть осторожным, чтобы никогда не уничтожать всю ссылку на массив, но в конце концов это общий JS беспокойство.Я бы никогда не хотел использовать трансляцию,
$apply
и / или подобные вещи, потому что хорошие ОО-практики imho всегда будут превосходить любые угловые магии.