AngularJS: Fabrika nedir?


102

Üzerinde çok çalışma yapıyorum Angular.jsve genel olarak bunu ilginç ve güçlü bir çerçeve olarak görüyorum.

Hizmetler, Fabrikalar, Sağlayıcılar ve Değerler konusunda birçok tartışma yapıldığını biliyorum, ancak a'nın ne Factoryolduğu konusunda hala kafam karışık .

Fabrika, diğer StackOverflow tartışmalarında aşağıdaki gibi tanımlanmıştır:

Fabrikalar

Sözdizimi: module.factory( 'factoryName', function );Sonuç: factoryName'i enjekte edilebilir bir argüman olarak bildirirken, module.factory'ye iletilen işlev başvurusunu çağırarak döndürülen değer size sağlanacaktır.

Bu açıklamayı kavramayı çok zor buluyorum ve fabrikanın ne olduğuna dair anlayışımı artırmıyor.

Misiniz herkes tam olarak ne hakkında paylaşımına herhangi bir açıklama veya gerçek hayat örnekler var Factoryve neden bir yerine kullanmalısınız Service, Providerya diğeri?

Güncelleme

A service , herhangi bir nesneye bir referans içerir .

A factory , herhangi bir nesneyi döndüren bir işlevdir

A provider , herhangi bir işlevi döndüren bir işlevdir

- vay be -


6
Bunun bu sorunun bir kopyası olduğunu söylemem, bunun yerine bu soruyu sormadan önce okudum çünkü cevabı Factories(yukarıda alıntılanan) biraz kafa karıştırıcıydı. Aşağıdaki yanıtlardan bazıları, Factoriesbenim bile anlayabileceğim bir şeye indirgeniyor
Code Whisperer

1
Bu sorunun "yinelediği" sorudan daha fazla olumlu oyu var, belki de işler tam tersi olmalı?
Code Whisperer

3
Bu bağlantı bunu iyi açıklıyor.
Ahmed

Yanıtlar:


71

Anladığım kadarıyla hepsi hemen hemen aynı. En büyük farklar karmaşıklıklarıdır. Sağlayıcılar çalışma zamanında yapılandırılabilir, fabrikalar biraz daha sağlamdır ve hizmetler en basit biçimdir.

Bu soruya göz atın AngularJS: Servis, sağlayıcı vs fabrika

Ayrıca bu öz , ince farklılıkları anlamada yardımcı olabilir.

Kaynak: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc

jsFiddle: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/

yazar: Pawel Kozlowski

var myApp = angular.module('myApp', []);

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!";
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!";
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!";
            }
        };
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​

Yani onlara bakmanın bir yolu, karmaşıklık sırasına göre gittikleri Provider > Factory > Service > Valuemi?
Code Whisperer

2
Bu, ona bakmanın bir yolu, diğeri ise Fabrika ve Hizmeti Sağlayıcının soyutlamaları olarak düşünmek olabilir. Birisi yanılıyorsam düzeltir ama Fabrika ve Servis Kaputun altında Sağlayıcı kullanır. Bu nedenle "Metale en yakın" versiyonunu sağlar. Değerin, daha sonra uygulama genelinde kullanılabilecek sabitleri tanımlamanın bir yolu olduğuna inanıyorum.
Jonathan Palumbo

18

Gördüğüm en büyük farklardan biri, fabrikada özel kod çalıştırabilmeniz. Ancak bir hizmette yalnızca nesne oluşturma gerçekleşir.

myJs.factory('Factory', function() {

    //Write custom code here

    return {
            Hello: function() {
            return "Hello, World!"
        }
    };
});

1
ayrıca bir hizmet yapıcı işlevinde özel kod çalıştırabilirsiniz, değil mi? kimse, diğer kod koşamam bir yapıcı işlevi içinde adı geçen
nonopolarity

9

Bu konudaki iki sentim. Ben çok acemiyim ve sadece Angular JS'yi anlamaya başladım ve bu benim kafamı çok karıştıran şeylerden biriydi ve bu yüzden onu biraz ayrıntılı olarak inceledim. Röportaj vermek için notlar alıyorum ve bu başkaları için faydalı olabilir.

  • hizmet ve fabrika aynı şeyleri farklı şekillerde yapar
  • ikisi de enjekte edilebilir
  • çoğu şey için fabrika sözdizimini kullanın
  • anlaşılması daha kolay
  • es6 ile günümüzde "service" yapılıyor çünkü es6 sınıflarına daha iyi dönüşüyor
  • esasen iş mantığını denetleyiciden soyutlayarak
  • denetleyicilerle biz mantığını kullanırsanız, yalnızca denetleyicilerle kullanabilirsiniz
  • denetleyici, uzun biz mantığını işlemeyen verileri kapsama koymak içindir
  • bu nedenle yukarıdaki senaryoda olan şey karmaşık biz mantığının kontrolörlere bağlanmasıdır. Verileri işlemek için değil. Öyleyse parçalarını hizmetlere veya fabrikaya koyun. Yani kodunuz zayıf ve modülerdir.
  • hizmetler tekildir

0

Hizmetler çoğunlukla içinde nesnenin yapıcı sınıfını tanımladığınız nesnelerdir. Çerçevenin derinliklerinde Object.create () işlevi çağrılır ve ardından bir denetleyici kullanarak nesnesini ve yöntemlerini çağırarak bir hizmeti kullanabilirsiniz. Öte yandan fabrika, varsayılan olarak bir nesne oluşturmaz ve bu nedenle, tüm öznitelikleri ve yöntemleri tanımlamayı bitirdikten sonra tüm nesne konumunu döndürmenizi gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.