2013-03-20 15 views
9

Ben Hayvanlar bir koleksiyona sahip.Backbone Koleksiyon

App.Collections.Animals extends Backbone.Collection 
    model: App.Animal 
    url: '/animals/' #returns json 

Ve bunlar hayvan sınıfları:

App.Models.Animal extends Backbone.Model 

App.Models.Monkey extends App.Models.Animal 
    defaults:{type:'Monkey'} 

App.Models.Cat extends App.Models.Animal 
    defaults:{type:'Cat'} 

App.Models.Dog extends App.Models.Animal 
    defaults:{type:'Dog'} 

koleksiyon Ben modeller alt sınıflandırılır modelleri (Maymun, Kedi olarak örneklenemez istiyorum (kayıtlar tip özelliği içeren) JSON ile doldurulduğunda, Köpek) ve Hayvan olarak değil. Bunu nasıl başarabilirsin?

cevap

12

:

koleksiyonu da bir model döndüren bir işlev ile bu özelliği geçersiz kılarak polimorfik modellerini içerebilir.

var Library = Backbone.Collection.extend({ 

    model: function(attrs, options) { 
    if (condition) { 
     return new PublicDocument(attrs, options); 
    } else { 
     return new PrivateDocument(attrs, options); 
    } 
    } 

}); 
0

geçersiz kıl omurga koleksiyonun _prepareModel. Koleksiyon yeni tanımlandığında alt sınıfları kullanır, aksi takdirde varsayılan model kullanılır. Omurga documentation itibaren

class App.Collections.Animals extends Backbone.Collection 

model: App.Models.Animal 

_prepareModel: (attrs, options) -> 
    if attrs instanceof Backbone.Model 
    attrs.collection = @ 
    return attrs 

    options || (options = {}) 
    options.collection = @ 
    model_class = APP.Models[attrs.ntype] or this.model 
    model = new model_class(attrs, options) 
    if (!model._validate(attrs, options)) 
    false 
    else 
    model 
6

çözeltisi (I CoffeeScript bilmiyorum JS af) basittir:

var SmartZoo = Backbone.Collection.extend({ 
    model: function (attrs, options) { 
     // This code assumes that the object looks something like '{ type: "Cat", ... }'. 
     switch (attrs.type) { 
      case 'Cat': 
       return new Cat(attrs, options); 
      case 'Dog': 
       return new Dog(attrs, options); 
      default: // Unknown subclass 
       return new Animal(attrs, options); 
     } 
    } 
}); 

Yapmalisin:

  1. Modelinizdeki bir öznitelik gelen içer Oluşturmak için omurga modelinin türünü bulabilirsin. Bu örnekte, nesnelerim değeri temsil eden Backbone türünün tam adı olan "type" adında bir özellik içerir. Bunu, modele varsayılan olarak ayarladığınızdan veya Modelinizin başlatıldığından emin olun. Böylece, koleksiyona gerçek model örnekleri de ekleyebilirsiniz.
  2. bir fonksiyonu olarak toplama modelleri özelliğini tanımlayın. Bu işlevin ilk parametresi ham JS nesnesi (eğer ilettiğiniz buyduysa) veya bir Omurga modelinin öznitelik nesnesi olacaktır. Her iki şekilde de, bu alanın bir özelliği olarak tür alanınıza erişebilirsiniz.
  3. senin tipin alanından uygun bir model anlaması için mantık yürütün.
  4. modelleri işlevinden doğru modelin bir örneğini döndürür
  5. . İşte

eyleminde bu polimorfik koleksiyon gösteren bir JSFiddle geçerli: http://jsfiddle.net/FiddlerOnTheTarmac/uR2Sa/

+0

Sadece unutmayın toplama) ('eğer modellerin çok olabilir eğer; eğer varsa; başka '' switch' çok daha fazla performans – seebiscuit