Правильно ли передавать «текущий» $scope
сервису AngularJS?
Я нахожусь в ситуации, когда у меня $ service, зная, что он используется только одним контроллером, и я хотел бы иметь ссылку на область действия контроллера в самих методах $ service.
Это правильно с философской точки зрения?
Или мне лучше транслировать события в $ rootScope, а затем заставить мой контроллер их слушать?
$scope
свойствам и вызывать$scope.$apply
при необходимости.$scope
... как контроллер может напрямую обращаться к данным в службе и передавать их в представление, не делая этого?Ответы:
Чтобы сообщить контроллеру, когда происходит что-то асинхронное, используйте обещания Angular .
Чтобы спровоцировать
$apply
, вам не нужна область видимости, вы можете вызвать$rootScope.$apply
, поскольку нет разницы, вызывая ее в определенной области или в корне.Что касается чтения переменных, лучше бы вы получили параметры. Но вы также можете прочитать его из области видимости как параметр объекта, но я бы выбрал параметр, который сделает ваш интерфейс службы намного более понятным.
источник
$scope
через вызов службы с использованиемexecuteSql()
функции async . Рассматривая 3 варианта (1) используйте обратный вызов для функции async, затем вызовите$scope.$apply
... это работает, но уродливо (2) перейдите$scope
к функции async, затем вызовитеtheScope.$apply()
... это также работает (3) используйте обещание. .. еще не пробовал. Почему обещание - лучший способ? Спасибо!Я бы сказал, что если ваша функциональность предназначена только для одного контроллера, тогда вам не нужна услуга.
Задачи контроллеров - управлять конкретной моделью, тогда как служба должна иметь дело с глобальными задачами. Я бы предпочел придерживаться этой парадигмы, чем что-то путать.
Это то, что говорят документы
обслуживание
Контроллер
PS: Кроме того, если вам нужно дайджест, вы также можете вставить $ rootScope в свой сервис.
источник
$apply
или вызове$digest
$ rootScope для меня полностью осмысленно.Да. Вы можете передать $ scope в службу при ее инициализации. В конструкторе службы вы можете назначить область видимости примерно так :_scope, а затем ссылаться на область внутри службы!
источник
$scope
всякий раз, когда данный контроллер внедряет службу, чтобы не вызывать метод службы и вручную переходить$scope
к ней.new MyFunction()
). Вопрос касался услуги,new
в которую нельзя позвонить .Я лично считаю, что переход
$scope
к службе - плохая идея , потому что он создает своего рода циклическую ссылку: контроллер зависит от службы, а служба зависит от области действия контроллера.Такие вещи, как эта, не только сбивают с толку с точки зрения отношений, но и мешают сборщику мусора.
Я предпочитаю поместить объект домена в область контроллера и передать его службе. Таким образом, служба работает независимо от того, используется ли она внутри контроллера или, возможно, внутри другой службы в будущем.
Например, если служба должна выталкивать и извлекать элементы из массива
errors
, мой код будет:Затем служба взаимодействует с контроллером, оперируя
errors
. Конечно, я должен быть осторожен и никогда не стирать всю ссылку на массив, но, в конце концов, это общая проблема JS.Я бы никогда не хотел использовать трансляцию
$apply
и / или подобные вещи, потому что имхо хорошие OO-практики всегда будут превосходить любые Angular-magics.источник
$scope.errors = []; $scope.myService = new MyService($scope.errors);
errors
живет независимо от$scope
. В этом весь смысл этого ответа. Пожалуйста, проверьте ссылку, которую я предоставил в тексте. Ура.$scope.errors
указывает наvar errors
, а ошибки переменных кажутся мне избыточными, поскольку это просто еще один указатель. Одна подобная ситуация , я думаю, и что это явно избыточными этот кусок кода:const errors = errors2 = errors3 = []; $scope.errors = errors;
. Согласны ли вы с тем, что только предоставленный вами фрагмент кода кажетсяvar errors = []
излишним?errors
живет независимо от$scope
. Вам необходимо понимать, что такое объект домена, а также что такоеvar
назначение. Если предоставленной мной ссылки недостаточно, есть много других материалов.MyService(errors)
. Насколько я понимаю, служба должна создавать массив журналов на основе параметра (в данном случае указателя). Для меня это плохой образец, так как сервисы являются одиночными в angular. Если реализация службы хорошо запрограммирована, она должна сгенерировать массив во внутренней переменной (чтобы она оставалась одноэлементной). Следовательно, нет смысла инициализировать переменную вне сервиса.