Скажем, у меня есть файл crudService.js:
crudService.module('genericCrudService', ['$http', '$log', 'config', function ($http, $log, config) {
....
return {
setSomeAttribute: function(m) {
// set attribute
}
}
}]);
И тогда у меня есть модуль, которому нужно по-разному настроить экземпляры этой службы crud:
module.factory('Task', ['genericCrudService','genericCrudService', function (service, actionService) {
...
return {
init: function(p) {
service.setSomeAttribute('a');
actionService.setSomeAttribute('b');
}
}
}]);
Но затем я заметил при попытке использовать служебную переменную, что ее атрибут установлен на 'a'. Что я делаю не так?
Угловые услуги - это синглтоны, которые кэшируются при первой инъекции:
Все сервисы в Angular - это одиночные игры. Это означает, что инжектор использует каждый рецепт не более одного раза для создания объекта. Затем инжектор кэширует ссылку для всех будущих потребностей.
genericCrudService
относится к одной и той же службе, вводя ее в качестве service
и переменных actionService
приводит к наличию экземпляра службы genericCrudService
в обеих переменных, service === actionService
.
Если служба должна получить новый экземпляр только в некоторых случаях, экземпляр службы может получить метод (например, factory
или getInstance
), который возвращает новый экземпляр объекта:
app.factory('service', () => {
function Service() {
this.method = ...;
this.factory = () => new Service;
}
return new Service;
});
...
var serviceInstance = service.factory();
Если служба должна получить новый экземпляр повсюду, он должен вернуть функцию фабрики или конструктора, которая будет создаваться вручную:
app.factory('Service', () => function () {
this.method = ...;
});
...
var serviceInstance = new Service;
Вы не можете этого сделать, потому что угловое обслуживание - одноэлементное... Посмотрите на этот пост, он объясняет это очень хорошо;) Есть услуги Angularjs singleton?
Вы также можете посмотреть, что AngularJS: Service vs provider vs factory. Может быть, вы найдете способ сделать то, что хотите;)