Angular JS - Украсить сервис именем контроллера
Мне неясно, как именно decorator
работает в сочетании с угловым $injector
поэтому любое объяснение полезно.
Учитывая мой myTempService
:
$provide.decorator('myTempService', function($delegate) {
$delegate.controller = // some service to get the current controller
return $delegate;
});
когда myTempService
вводится в мой контроллер, мне нужно myTempService.controller
быть именем контроллера:
.controller('MainCtrl', function (myTempService) {
console.log(myTempService.controller); // MainCtrl
});
1 ответ
Когда вы используете .value()
, .service()
, .factory()
а также .provider()
чтобы зарегистрировать службу, то, что вы передадите в качестве второго параметра, будет фактически являться частью Конструктора поставщика услуг.
Когда начинается процесс начальной загрузки angular, каждый из этих зарегистрированных конструкторов поставщика услуг будет использоваться для создания экземпляра поставщика услуг.
На этапе настройки экземпляры поставщика услуг доступны для внедрения, и их можно использовать для изменения конфигурации по умолчанию для создаваемых экземпляров службы.
angular.module('myApp').config(function ($httpProvider) {
// $httpProvider is a provider instance of the $http service
$httpProvider.interceptors.push(function () {});
});
Перед входом в фазу выполнения каждый экземпляр поставщика услуг будет использоваться для создания экземпляра службы.
Тогда декораторы вступят в игру на этом этапе. Прежде чем эти экземпляры службы будут использоваться для внедрения в различные места, каждый экземпляр службы будет передан в свои зарегистрированные декораторы как $delegate
параметр, если есть. Результат функции декоратора будет использоваться вместо исходного экземпляра сервиса.
angular.module('myApp').config(function ($provide) {
$provide.decorator('$http', function ($delegate) {
// monkey patching
var originalGet = $delegate.get;
$delegate.get = function () {
console.log('$http.get is called');
return originalGet.apply(this, arguments);
};
return $delegate;
});
});
Поэтому в функции декоратора у вас есть выбор:
- Просто сделайте что-нибудь и верните исходный экземпляр службы, например, распечатайте что-нибудь для целей отладки.
- Установите начальные значения службы, которые по некоторым причинам не могут быть выполнены в фазе конфигурации.
- Обезьяна исправит исходный экземпляр службы и вернет его.
- Создайте и верните службу оболочки / прокси поверх исходного экземпляра службы.
- В модульном тестировании вы могли бы вместо этого вернуть объект-шпион.
Наконец, экземпляры службы будут доступны для внедрения во все места, например, блоки выполнения, контроллеры, директивы, фильтры и т. Д. В течение всего срока службы приложения.