5

Załóżmy utworzyć fabryki, usługi lub obiekt dostawcy jak takJak utworzyć obiekt usługi, które nie dzielić swoje wartości ze sterownikami, które je spożywają

myApp.factory('myService', function() { 
    return { 
    counter: 0, 
    increment: function() { 
     console.log('counter: ' + (this.counter++)) 
    } 
    }; 
}); 

I przypuśćmy Mam kontroler, który zależy na nim

myApp.controller('myCtrl', function(myService) { 
    $scope.incr = function() { 
    myService.increment(); 
    }; 
} 

I zastosowanie tego kontrolera w różnych częściach html

<div ng-controller="myCtrl"> 
    <button ng-click="increment()">increment</button> 
</div> 
... 
<div ng-controller="myCtrl"> 
    <button ng-click="increment()">increment</button> 
</div> 

Teraz, gdy klikam na każdym przycisku, licznik jest uniwersalny i wynosi 0, 1, 2, 3, ...

Jak mogę napisać moją fabrykę, usługę lub dostawcę, aby każdy kontroler otrzymał inna kopia obiektu usługi?

+1

Wszystkie usługi kątowe są samotnymi. To, czego chcesz, to usługa fabryczna, której możesz użyć do stworzenia swojej usługi. Na przykład. 'MyServiceFactory', wprowadź to do kontrolera i pozwól mu utworzyć metodę' myService'. – Yoshi

+0

Hi @Yoshi. Tak, przeczytałem, że wszystkie usługi są singletonami, dlatego mam problemy z tworzeniem oddzielnych instancji. Czy możesz wyjaśnić, co masz na myśli, tworząc serwis fabryczny i wprowadzając go do kontrolera? Czy to nie jest to, co zrobiłem w moim przykładzie? – kane

+1

Niezupełnie. Użyłeś konkretnej usługi (utworzonej przez kąt), która następnie jest udostępniana przez wstrzyknięcie. Potrzebujesz innej usługi (wspomnianej wyżej lub podobnej), dzięki której możesz podać własną metodę tworzenia "myService", która będzie używana wewnątrz kontrolera. Na przykład. 'var myService = MyServiceFactory.createService();' – Yoshi

Odpowiedz

5

Ponieważ fabryki są singletonami, musisz użyć metody w swojej fabryce, aby utworzyć usługę za każdym razem. Zmień swoje usługi, aby mieć metodę tworzenia, która zwraca swoje usługi, która robi inkrementację:

myApp.factory('myService', function() { 
    return { 
    create: function() { 
     return { 
     counter: 0, 
     increment: function() { 
      console.log('counter: ' + (this.counter++)); 
     } 
     }; 
    } 
    }; 
}); 

myApp.controller('myCtrl', function($scope, myService) { 
    var service = myService.create(); 
    $scope.incr = function() { 
    service.increment(); 
    }; 
}); 

także nazwa metody kontrolera nie pasuje do tego, co jest w widoku:

<div ng-controller="myCtrl"> 
    <button ng-click="incr()">increment</button> 
</div> 
... 
<div ng-controller="myCtrl"> 
    <button ng-click="incr()">increment</button> 
</div> 

Plunkr

Powiązane problemy