Задать вопрос
dshster
@dshster
Javascript, Frontend

Как создать новый экземпляр сервиса (Service) при инициализации директивы?

Засел над проблемой: у меня есть несколько экземпляров директивы, при инициализации директивы в её контроллер инжектится сервис, который должен (по документации) создавать свой экземпляр конструктора:
<div sample=""></div>
<div sample=""></div>
<div sample=""></div>

angular.module('application', [])
	.service('fooBar', [function() {
		var param = null;

        this.setParam = function(value) {
            param = value;
        };

        this.getParam = function() {
            return param;
        };
	}])

	.directive('sample', [function() {
        return {
            restrict: 'AE',
            scope: false,
            controller: ['fooBar', function(fooBar) {
                console.log(fooBar.getParam());
                fooBar.setParam('test');
            }]
        }
    }])

jsfiddle.net/dmitry_shvalyov/7d7syjtx

Результат в консоле. По идее, если сервис создаёт новый экземпляр (new Constructor), то каждый раз после создания метод getParam должен возвращать null. Но что-то идёт не так и не соображу как исправить.
  • Вопрос задан
  • 322 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
miraage
@miraage
Старый прогер
Само собой, вам нужен factory.

angular.module('applicaton', [])

.factory('fooBar', function() {
  function Service() {
    var param = null;
    
    this.setParam = function(param) {
      param = param;
    };
    
    this.getParam = function() {
      return param;
    };
  }
  
  return function() {
    return new Service();
  }
})

.directive('sample', function() {
  return {
    restrict: 'AE',
    scope: false,
    controller: function(fooBar) {
      var service = fooBar();
      service.setParam('test');
    }
  };
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
который должен (по документации) создавать свой экземпляр конструктора:

вы не дочитали документацию. $injector делает это ровно один раз, вы можете его попросить сделать это еще раз, но если у вас возникает такая нужда значит вы что-то делаете не так. В целом все сервисы в ангуляре инстанцируются в единственном экземпляре.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы