5

Supponiamo creo una fabbrica, di servizio, o di un oggetto fornitore in questo modoCome rendere un oggetto servizio che non condivide i suoi valori con i controller che consumano

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

E supponiamo di avere un controller che dipende su di esso

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

E applico questo controllore in diverse parti del html

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

Al momento, quando clicco su ciascun pulsante, il contatore è universale e passa a 0, 1, 2, 3, ...

Come posso scrivere la mia fabbrica, servizio o fornitore in modo che ogni controller ottenga un copia diversa dell'oggetto di servizio?

+1

Tutti i servizi in angolare sono single. Quello che vuoi è un servizio di fabbrica, che puoi utilizzare per creare il tuo servizio. Per esempio. 'MyServiceFactory', inseriscilo nel controller e lascia che abbia un metodo per creare un' myService'. – Yoshi

+0

Ciao @Yoshi. Sì, ho letto che tutti i servizi sono singletons ed è per questo che ho difficoltà a creare istanze separate. Puoi approfondire cosa intendi creando un servizio di fabbrica e inserendolo nel controller? Non è quello che ho fatto nel mio esempio? – kane

+1

Non proprio. Hai usato un servizio concreto (istanziato da angolare), che poi viene condiviso tramite iniezione. È necessario un altro servizio (il suddetto factory o simile), con il quale si fornisce il proprio metodo di creazione per un 'myService' da utilizzare all'interno del controller. Per esempio. 'var myService = MyServiceFactory.createService();' – Yoshi

risposta

5

Poiché le fabbriche sono singleton, è necessario utilizzare un metodo in fabbrica per creare il servizio ogni volta. Cambiare il vostro servizio per avere un metodo create che restituisce il servizio che fa l'Incrementale:

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

anche il nome del metodo di controllo non corrisponde fino a ciò che è nella vista:

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

Plunkr

Problemi correlati