SORU
27 Mart 2013, ÇARŞAMBA


AngularJS : Servis sağlayıcı vs vs fabrika

Ne AngularJS arasındaki farklar modülü Service, Provider Factory?

CEVAP
27 Mart 2013, ÇARŞAMBA


AngularJS e-posta listesinden servisi fabrika vs vs sağlayıcı ve enjeksiyon kullanımını açıklayan an amazing thread aldım. Cevapları derleme

Hizmetleri

Kullanımı: module.service( 'serviceName', function );işlevi bir örneği verilecektir. Diğer bir deyişlenew FunctionYouPassedToService().

Fabrikalar

Kullanımı: module.factory( 'factoryName', function );işlev başvurusu çağırarak döndürülen değeri modülüne geçti.fabrika.

Sağlayıcıları

Kullanımı: module.provider( 'providerName', function );verilecektirProviderFunction().$get(). Yapıcı işlevi, yöntemi denir al $daha önce örneği - ProviderFunction işlev başvurusu modülüne geçirilir.sağlayıcı.

Sağlayıcıları modülü yapılandırma aşamasında yapılandırılabilir avantajı var.

Sağlanan kodu için here bkz.

İşte Misko tarafından büyük başka bir açıklama:

provide.value('a', 123);

function Controller(a) {
  expect(a).toEqual(123);
}

Bu durumda enjektörü sadece olarak değerini verir. Ama eğer değerini hesaplamak için ne yapmalı? Sonra bir fabrika

provide.factory('b', function(a) {
  return a*2;
});

function Controller(b) {
  expect(b).toEqual(246);
}

factory değer oluşturma sorumlu olan bir işlevdir. Fabrika işlevi diğer bağımlılıklar isteyebilir dikkat edin.

Ama daha OO olmak istiyorum ve bir sınıf Karşılayıcı denir.

function Greeter(a) {
  this.greet = function() {
    return 'Hello '   a;
  }
}

Oluşturmak için daha sonra yazmak gerekir

provide.factory('greeter', function(a) {
  return new Greeter(a);
});

'Karşılayıcı' böyle denetleyicisi . isteyebiliriz o zaman

function Controller(greeter) {
  expect(greeter instanceof Greeter).toBe(true);
  expect(greeter.greet()).toEqual('Hello 123');
}

Ama bu şekilde çok uzunlar. Bu yazmak için daha kısa bir yol provider.service('greeter', Greeter); olurdu

Ama eğer enjeksiyon önce Greeter sınıf yapılandırmak istersek? Daha sonra yazabiliriz

provide.provider('greeter2', function() {
  var salutation = 'Hello';
  this.setSalutation = function(s) {
    salutation = s;
  }

  function Greeter(a) {
    this.greet = function() {
      return salutation   ' '   a;
    }
  }

  this.$get = function(a) {
    return new Greeter(a);
  };
});

O zaman bunu yapabiliriz:

angular.module('abc', []).config(function(greeter2Provider) {
  greeter2Provider.setSalutation('Halo');
});

function Controller(greeter2) {
  expect(greeter2.greet()).toEqual('Halo 123');
}

Bir yan not olarak, service, factory value sağlayıcı türemiştir.

provider.service = function(name, Class) {
  provider.provide(name, function() {
    this.$get = function($injector) {
      return $injector.instantiate(Class);
    };
  });
}

provider.factory = function(name, factory) {
  provider.provide(name, function() {
    this.$get = function($injector) {
      return $injector.invoke(factory);
    };
  });
}

provider.value = function(name, value) {
  provider.factory(name, function() {
    return value;
  });
};

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan D.

    Jonathan D.

    3 Kasım 2006
  • Madeon

    Madeon

    31 Ocak 2010
  • Slave Boy Films - Fandom from a Galaxy Far Far Away

    Slave Boy Fi

    12 HAZİRAN 2009