SORU
14 Ocak 2013, PAZARTESİ


açısal.vs açısal hizmeti.fabrika

angular.factory() angular.service() hem hizmetleri bildirmek zorundadır; ancak, 20* angular.service ben *her yerde resmi belgelerinde.

İki yöntem arasındaki fark nedir? Ne için (farklı şeyler yapıyorlar varsayarak) kullanılmalıdır?

CEVAP
20 ŞUBAT 2014, PERŞEMBE


  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);

Kendimi bu şekilde koyana kadar sorun bu kavramı kabullenmekte vardı:

Hizmet:işleviyazdığınız olacaktıryeni-ed:

  myInjectedService  <----  new myServiceFunction()

Fabrika:işlevi(kurucu) yazmak olacaktırçağrılan:

  myInjectedFactory  <---  myFactoryFunction()

Onunla ne yapacağın sana kalmış, ama bazı yararlı desenleri vardır.

Bir yazı gibihizmetfonksiyon ortak bir API göstermek için:

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

Ya da kullanmafabrikafonksiyon ortak bir API göstermek için:

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars "   aPrivateVariable;
  }

  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

Ya da kullanmafabrikafonksiyon oluşturucu dönmek için:

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

Hangisi kullanılır?...

Her ikisi ile de aynı şeyi yapabilirsiniz. Ancak, bazı durumlardafabrikabiraz daha basit bir sözdizimi ile enjekte edilebilir oluşturmak için daha fazla esneklik sağlar. Bu myİnjectedService her zaman bir nesne olması gerekir, ancak myİnjectedFactory bir nesne, bir işlev başvurusu veya herhangi bir değer olabilir çünkü. Eğer bir kurucu oluşturmak için bir hizmet yazarsan örneğin, (son yukarıdaki örnekte olduğu gibi) gibi bir çok örneği olmalı:

var myShinyNewObject = new myInjectedService.myFunction()

bu belki daha az arzu edilir:

var myShinyNewObject = new myInjectedFactory();

(Ama, çünkü en başta bu tür bir model kullanma konusunda dikkatli olmalısınızyenisenin denetleyicileri-ıng nesneleri zor test için sahte olan zor parça bağımlılıkları oluşturur. Daha iyi new() daha bir hizmet için nesnelerin bir koleksiyonu yönetmek için kurnaz-nilly.)


Bir şey daha, tüm Tekiz

Ayrıca her iki durumda da, sana bir tek yönetmenize yardımcı olduğunu unutmayın. Size hizmet enjekte ya da işlevi ne olursa olsun, aynı nesneyi ya da fonksiyonu için aynı referans alacak. (Bir sayı veya dize gibi bir fabrika sadece bir değer verdiğinde hariç. Bu durumda, her zaman aynı değer, ama bir referans olacaktır.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006
  • ŠĩŗĜŕôŵåɭȍҭҭ

    ŠĩŗĜŕô

    29 Kasım 2009
  • Tek Syndicate

    Tek Syndicat

    23 Temmuz 2008