5

Nehmen wir an, ich eine Fabrik, eine Dienstleistung oder Provider-Objekt wie soWie ein Dienstobjekt zu machen, die nicht ihre Werte mit den Controllern nicht teilt, die es konsumieren

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

Und wenn ich einen Controller haben, hängt auf sie

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

Und ich wenden sie diesen Regler in verschiedenen Teilen des html

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

Gerade jetzt, wenn ich auf jede Taste klicke, ist der Zähler universal und es geht 0, 1, 2, 3, ...

Wie kann ich meine Fabrik, Service oder Provider schreiben, so dass jeder Controller einen bekommt verschiedene Kopie des Serviceobjekts?

+1

Alle Dienste in Winkel Singletons sind. Was Sie wollen, ist ein Factory-Service, mit dem Sie Ihren Service erstellen können. Z.B. 'MyServiceFactory', injiziere dies in den Controller und lass es eine Methode haben, einen' myService' zu ​​erstellen. – Yoshi

+0

Hallo @ Yoshi. Ja, ich habe gelesen, dass alle Dienste Singletons sind, weshalb ich Probleme habe, separate Instanzen zu erstellen. Können Sie näher erläutern, was Sie meinen, indem Sie einen Werksservice erstellen und in den Controller einspeisen? Ist das nicht, was ich in meinem Beispiel getan habe? – kane

+1

Nicht wirklich. Sie haben einen konkreten Dienst (instanziiert durch Winkel) verwendet, der dann durch Injektion geteilt wird. Sie benötigen einen anderen Dienst (die oben genannte Fabrik oder Ähnliches), mit dem Sie Ihre eigene Erstellungsmethode für einen 'myService' bereitstellen würden, der innerhalb des Controllers verwendet werden soll. Z.B. 'var myService = MyServiceFactory.createService();' – Yoshi

Antwort

5

Da Fabriken Einzelwerke sind, müssen Sie in Ihrer Fabrik eine Methode verwenden, um jedes Mal Ihren Service zu erstellen. Ändern Sie Ihren Dienst eine create-Methode zu haben, die Ihren Dienst zurück, der das Inkrementieren tut:

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(); 
    }; 
}); 

Auch die Controller-Methode Name übereinstimmen nicht zu dem, was in der Ansicht ist:

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

Plunkr