5

en Öyletüketmek kontrolörleri ile değerlerini paylaşmaz bir hizmet nesnesi nasıl yapılır

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

gibi bir fabrika, hizmet veya sağlayıcı nesne oluşturmak varsayalım Ve bağlı olan bir denetleyici olduğunu varsayalım üzerinde

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

Ve html

<div ng-controller="myCtrl"> 
    <button ng-click="increment()">increment</button> 
</div> 
... 
<div ng-controller="myCtrl"> 
    <button ng-click="increment()">increment</button> 
</div> 
farklı yerlerinde bu denetleyici uygulamakŞu anda, her bir düğmeye bastığımda, sayaç evrenseldir ve 0, 1, 2, 3, ...

Her bir denetleyicinin alması için fabrikamı, hizmeti veya sağlayıcımı nasıl yazabilirim? servis nesnesinin farklı kopyası?

+1

Tüm hizmetler singletons vardır. İstediğiniz, hizmetinizi oluşturmak için kullanabileceğiniz bir fabrika servisidir. Örneğin. MyServiceFactory, bunu denetleyiciye enjekte edin ve bir "myService" oluşturmak için bir yöntemi olmasına izin verin. – Yoshi

+0

Merhaba @Yoshi. Evet, tüm servislerin singleton olduğunu okudum, bu yüzden ayrı örnekler yaratmakta zorlanıyorum. Bir fabrika servisi oluşturarak ve kontrolöre enjekte ederek ne demek istediğini açıklayabilir misiniz? Örneğimde yaptığım bu değil miydi? – kane

+1

Gerçekten değil. Enjeksiyonla paylaşılan somut bir hizmet kullandınız. Denetleyicide kullanılacak bir “myService” için kendi oluşturma yönteminizi sağlayacağınız başka bir hizmete (yukarıda belirtilen fabrika veya benzeri) ihtiyacınız vardır. Örneğin. 'var myService = MyServiceFactory.createService();' – Yoshi

cevap

5

Fabrikalar tekil olduklarından, her defasında servisinizi oluşturmak için fabrikada bir yöntem kullanmanız gerekecektir.

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

Plunkr

:

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

Ayrıca kontrolör yöntemi adı görünümde hangi kadar eşleşmiyor: artımlı sayı yapar hizmetinizi döndüren bir oluşturmak yöntemi olması hizmetinizi değiştirin

İlgili konular