2012-08-01 35 views
41

Tôi đã một mô hình xác định và một bộ sưu tập:Lọc bộ sưu tập xương sống bởi giá trị thuộc tính

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

}); 

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

Khi bộ sưu tập được dân cư với các mô hình, tôi cần một hộp bộ sưu tập mới được làm từ các mô hình hộp có một màu sắc cụ thể thuộc tính chứa trong bộ sưu tập hoàn chỉnh, tôi làm theo cách này:

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); 

Công trình này, nhưng tôi thấy nó hơi phức tạp và không hiệu quả. Có cách nào để làm điều tương tự này theo một cách đơn giản hơn không?

Đây là mã tôi đã mô tả: http://jsfiddle.net/HB88W/1/

Trả lời

82

Tôi thích trở về một thể hiện mới của bộ sưu tập. Điều này làm cho các phương thức lọc này có thể chuỗi (ví dụ: 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 này thay đổi cid trong mô hình? – janetsmith

+4

filterBy: function (thuộc tính, giá trị) { filters = this.filter (hàm (box) { return box.get (thuộc tính) === value; }); trả lại các Hộp mới (đã lọc); } – Josh

+0

Tại sao trả lại một hộp mới() '. Tôi sẽ viết var Boxes = Backbone.Collection.extend ({ mô hình: Box, byColor: function (color) { trả lại this.filter (hàm (box) { return box.get ("color") = == màu; }); } }); – marcoslhc

43

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

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

var red_collection = new Boxes(red_boxes); 
+8

'where' trả về một mảng của bộ sưu tập, chứ không phải đối tượng bộ sưu tập. – seebiscuit

+0

Đây là một giải pháp tuyệt vời, trừ khi bạn buộc phải sử dụng một phiên bản cũ hơn của Backbone mà không có "nơi" thực hiện được nêu ra. – paniclater

Các vấn đề liên quan