2012-08-01 23 views
41

Ben tanımlanmış bir model ve bir koleksiyon var: Belirli bir renge sahip Kutu modellerinin yapılmış yeni kutular koleksiyon koleksiyon modelleri ile doldurulurFiltre omurga toplama

var Box = Backbone.Model.extend({ 
    defaults: { 
     x: 0, 
     y: 0, 
     w: 1, 
     h: 1, 
     color: "black" 
    } 

}); 

var Boxes = Backbone.Collection.extend({ 
    model: Box 
}); 

gerek tam koleksiyonda yer alan özellik, ben bu şekilde yapın:

var sorted = boxes.groupBy(function(box) { 
    return box.get("color"); 
}); 


var red_boxes = _.first(_.values(_.pick(sorted, "red"))); 

var red_collection = new Boxes; 

red_boxes.each(function(box){ 
    red_collection.add(box); 
}); 

console.log(red_collection); 

Bu işler, ama biraz karmaşık ve unefficient bulabilirsiniz. Aynı şeyi daha basit bir şekilde yapmanın bir yolu var mı? Ben koleksiyonuna yeni bir örneğini dönen gibi http://jsfiddle.net/HB88W/1/

cevap

82

: Burada

ben tarif kodudur. Bu, bu filtreleme yöntemlerini zincirlenebilir yapar (örneğin, boxes.byColor("red").bySize("L")).

var Boxes = Backbone.Collection.extend({ 
    model: Box, 

    byColor: function (color) { 
     filtered = this.filter(function (box) { 
      return box.get("color") === color; 
     }); 
     return new Boxes(filtered); 
    } 
}); 

var red_boxes = boxes.byColor("red") 
+3

Will bu değişim cid görüyor musunuz? – janetsmith

+4

filterBy: işlev (öznitelik, değer) { süzüldü = this.filter (fonksiyonu (kutu) { dönüş box.get (özellik) === değeri; }); yeni döndü Kutular (filtrelenmiş); } – Josh

+0

Neden ') (a' yeni Kutuları dönün. Kutu, byColor: function (renk) { dönüş this.filter (function (kutu) { dönüş box.get ("color") = I var Kutular = Backbone.Collection.extend ({ modeli yazardı == rengi; }); } }); – marcoslhc

43

modelinde http://backbonejs.org/#Collection-where

var red_boxes = boxes.where({color: "red"}); 

var red_collection = new Boxes(red_boxes); 
+8

'Burada bir koleksiyon nesnesi yerine koleksiyonun bir dizisini döndürür. "burada" henüz uygulanmadı yok Omurga eski bir sürümünü kullanıyor zorla sürece – seebiscuit

+0

Bu, büyük bir çözümdür. – paniclater