Подтвердить что ты не робот

Скажите AngularJs, чтобы вернуть новый экземпляр через Injection Dependency

Пример использования прост: у меня есть два контроллера, имеющих одну и ту же зависимость MyService. Эта служба удерживает некоторое состояние, позволяет сидеть myVariable. Если я установил его из ControllerOne, он также будет замечен ControllerTwo.

Я хочу, чтобы каждый контроллер имел свой экземпляр MyService, так что myVariable может быть изменен каждым контроллером, не затрагивая другого.

Иными словами, я хочу, чтобы новый экземпляр возвращался программой Dependency Injection, , а не singleton.

4b9b3361

Ответ 1

Не так, как вы могли бы надеяться. Служебные экземпляры создаются в первый раз, когда они извлекаются инжектором и поддерживаются инжектором... другими словами, они всегда одиночные. Здесь происходит волшебство, особенно посмотрите на функцию provider, которая помещает экземпляр поставщика в объект providerCache.

Но не теряйте надежду, вы можете так же легко добавлять конструкторы для того, что вы хотите использовать в Сервисе, если вы так выбрали:

app.factory('myService', [function() {
     var i = 1;

     function Foo() {
        this.bar = "I'm Foo " + i++;
     };

     return {
          Foo: Foo
     };
}]);

app.controller('Ctrl1', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 1
});

app.controller('Ctrl2', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 2
});

EDIT: как указывал OP, существует также $injector.instantiate, который вы можете использовать для вызова конструкторов JavaScript за пределами вашего контроллера. Я не уверен, что подразумевается при тестировании здесь, но это дает вам еще один способ ввести код, который будет создавать для вас новый объект.

Ответ 2

Существует множество общих вариантов модульного кода JavaScript, но если вы хотите сделать что-то, что полагается исключительно на AngularJS, этот шаблон работает:

1) Сначала определите класс, который вы хотите вводить несколько раз:

function MyClass() {
  // ...
}

MyClass.prototype.memberMethod = function() {
  // ...
}

2) Затем сделайте конструктор доступным как константу:

angular.module('myModule').constant('MyClass', MyClass);

3) Наконец, используйте шаблон factory для создания именованных, инъецируемых экземпляров класса:

angular.module('myOtherModule', ['myModule']).factory('instanceOfMyClass', [
   'MyClass', 
   function(MyClass) { return new MyClass(); }
]);