2013-11-14 22 views
5

Angular ile oluşturulmuş bazı örnek uygulamalara bakıyorum. Modellerin nerede oluşturulduğunu/depolandığını arıyorum.Modelinizi Angular'de nerede saklıyor/yaratıyorsunuz?

customer.js:

function customer(){ 
    this.firstName; 
    this.lastName; 
} 

customer.prototype.getFullName = function(){ 
    return this.firstName + ' ' + this.lastName; 
} 

Ya ben ayrıca bkz bir fabrikada kullanılmasıdır:

Bazen modeli böyle javascript dosyası bir ovada saklanır fark ettik customerFactory.js:

app.factory("customer", function(){ 
    return function(){ 
    this.firstName; 
    this.lastName; 

    this.getFullName = function(){ 
     return this.firstName + ' ' + this.lastName; 
    }; 
    }; 
}); 

Yani benim soru, modelinizi depolamak ve neden nedir? Biri diğerinden daha avantajlı mı?

cevap

1

Özellikle ikinci yaklaşımı tercih ediyorum, yani modelleri oluşturmak için bir fabrika kullanın.

myApp.factory('Models', [function() { 
    return { 
     Customer: (function() { 
      var cls = function(obj) { 
       this.firstName = obj && obj.firstName || null; 
       this.lastName = obj && obj.lastName || null; 
      } 
      cls.prototype.getFullName = function() { 
       return this.firstName + ' ' + this.lastName; 
      }; 
      return cls; 
     })(), 
     Order: (function() { 
      var cls = function(obj) { 
       this.id = obj.id || null; 
       this.amount = obj.amount || null; 
      } 
      /* methods */ 
      return cls; 
     })() 
    } 
}]); 

Bu şekilde, yalnızca denetleyicileri tek bağımlılık enjekte vardır ve nesne tanımlanan modeli olduğunu explicity olur.

myApp.controller('myCtrl', ['$scope', 'Model', function($scope, Model) { 
    $scope.customer = new Model.Customer({ 
     firstName: "Beterraba" 
     , lastName: "Abacate" 
    }); 
}]); 
+0

Teşekkürler, sadece meraktan: 1) 'Cls' ne anlama geliyor. 2) Müşteri nesnesi neden kendini çağırıyor? 3) Tüm modellerinizi aynı fabrikaya yerleştiriyor musunuz? – Martijn

+0

@Martijn (1) "cls", "class" anlamına gelir; bu, js cinsinden ayrılmış bir sözcüktür. (2) Nesne kendisini çağırır, böylece sadece bir kez vücudunu değerlendirir. Eğer bu normal bir işlev olsaydı, her 'yeni' çağrı bütün sınıfı tekrar değerlendirirdi. (3) Kontrol cihazındaki birkaç enjeksiyondan kaçınmak için her şeyi tek bir fabrikada koymak istiyorum. – Beterraba

1

Ben models adında bir klasör oluşturmak için tercih ve her modeli bir fabrika olarak tanımlanan kendi dosyasını alır. Modellerimi tanımlamak için $resource'u da kullanıyorum, böylece $http çağrıları hakkında endişelenmem gerekmiyor (hemen hemen hiç).

Neden? Çünkü bu, Açısal uygulamaların oluşturulma şeklidir. Bunu yapmak, onları denetleyicilerinize, direktiflerinize vb. Enjekte etmenize izin verir. Modellerinizin Açısal agnostik olmasını istiyorsanız, bu iyi olur. "Limanlar ve Adaptörler" mimarisine uyar. Onları daha sonra bir fabrika olarak görün. Ayrı bir kütüphaneye Eğik-agnostik kodunu ayırmak ve sonra sadece daha sonra enjeksiyon için onları açığa:

Ayrıca
app.factory("Customer", function(){ return Models.Customer; }); 
app.factory("Order", function(){ return Models.Order; }); 

, ben ... başkentleri ile benim sınıf nesneleri adlandırmak ister haber, bir kongre ben gibi gerçekten somutlaştırılmasının bir "sınıf" olduğunu belirtmek için.

+0

Teşekkürler, bu yüzden sizin durumunuzda bir modeli tanımlamanın iki yolu vardır: biri dosyada, diğeri kaynak kullanıyor mu? Açısal agnostik ile Angular farkında değilsiniz? Yani sadece sade javascript? – Martijn

+1

Sağ. Şahsen, hepsini bir servise koymayı tercih ederim. Ancak, bazı insanlar, model/buisiness mantık/kullanım kodunun sadece saf JavaScript olduğunu ve Angular hakkında hiçbir şey bilmediğini söyleyen mimarinin "port ve adaptörler" tarzı gibi. O zaman, yukarıda olduğu gibi bağladın. Bu örnekte, Model.Customer sadece saf bir JavaScript'dir ve Angular'ın sınırları içinde yaşamamaktadır, ancak bir "fabrika" kullanarak "uyarlanmıştır". –