2012-08-09 34 views
7

Phương pháp hiện tại tôi đang sử dụng là để lọc một bộ sưu tập, mà trả về một mảng, và sử dụngBackbone.js: cách lọc đúng bộ sưu tập?

collection.reset(array) 

tái cư nó. Tuy nhiên, điều này sửa đổi bộ sưu tập ban đầu, vì vậy tôi đã thêm một mảng được gọi là "originalCollectionArray" theo dõi trạng thái mảng ban đầu của bộ sưu tập. Khi không có lọc đang hoạt động Tôi chỉ cần sử dụng

collection.reset(originalCollectionArray) 

Nhưng sau đó, tôi cần phải theo dõi thêm và loại bỏ các mô hình từ bộ sưu tập sản, vì vậy tôi đã làm điều này:

// inside collection 
initialize: function(params){ 
    this.originalCollectionArray = params; 
    this.on('add', this.addInOriginal, this); 
    this.on('remove', this.removeInOriginal, this); 
}, 
addInOriginal: function(model){ 
    this.originalCollectionArray.push(model.attributes); 
}, 
removeInOriginal: function(model){ 
    this.originalTasks = _(this.originalTasks).reject(function(val){ 
     return val.id == model.get('id'); 
    }); 
}, 
filterBy: function(params){ 
    this.reset(this.originalCollectionArray, {silent: true}); 
    var filteredColl = this.filter(function(item){ 
     // filter code... 
    }); 
    this.reset(filteredColl); 
} 

này nhanh chóng trở thành rườm rà khi tôi cố gắng thực hiện các thủ thuật khác liên quan đến thao tác thu thập, chẳng hạn như sắp xếp. Và thẳng thắn, mã của tôi trông hơi khó hiểu. Có một cách thanh lịch để làm điều này?

Cảm ơn

+1

Có bất cứ lý do bạn không chỉ sử dụng 'lấy ({thêm: true}) 'thay vì đặt lại? Có vẻ như đây là những gì bạn đang cố gắng đạt được. Tôi không chắc chắn chức năng 'filter' của bạn đang làm gì, nhưng bạn luôn có thể truyền' {data: {...}} 'để tìm nạp. – bvulaj

+0

Nếu tôi hiểu chính xác, bạn muốn tôi xóa originalCollectionArray và các sự kiện của nó hoàn toàn và tìm nạp dữ liệu gốc mỗi khi tôi lọc/sắp xếp (sắp xếp thực thi trên dữ liệu đã lọc, vì vậy mỗi loại cũng cần tìm nạp và lọc)? Vấn đề là, bộ lọc được kích hoạt khi người dùng nhập vào. Tôi nghĩ rằng nó sẽ lãng phí quá nhiều tài nguyên. Tôi chỉ nói về mặt giả thuyết. – chenglou

Trả lời

11

Bạn có thể tạo ra một bộ sưu tập như một thuộc tính của bộ sưu tập chính phản ánh tình trạng các bộ lọc:

var C = Backbone.Collection.extend({ 
    initialize: function (models) { 
     this.filtered = new Backbone.Collection(models); 
     this.on('add', this.refilter); 
     this.on('remove', this.refilter); 
    }, 

    filterBy: function (params){ 
     var filteredColl = this.filter(function(item){ 
      // ... 
     }); 

     this.filtered.params = params; 
     this.filtered.reset(filteredColl); 
    }, 

    refilter: function() { 
     this.filterBy(this.filtered.params); 
    } 
}); 

Bộ sưu tập cha mẹ giữ mô hình của mình bất cứ bộ lọc mà bạn áp dụng, và bạn liên kết với bộ sưu tập được lọc để biết thời điểm xảy ra thay đổi. Ràng buộc nội bộ trên các sự kiện thêm và xóa cho phép bạn áp dụng lại bộ lọc. Xem http://jsfiddle.net/dQr7X/ để có bản trình diễn.

1

Sự cố lớn trên mã của bạn là bạn đang sử dụng mảng thô làm bản gốc thay vì Bộ sưu tập. Mã của tôi là gần gũi với bạn nhưng chỉ sử dụng bộ sưu tập, vì vậy các method như add, loại bỏ và bộ lọc hoạt động trên bản gốc:

var OriginalCollection = Backbone.Collection.extend({ 
    }); 
    var FilteredCollection = Backbone.Collection.extend({ 
    initialize: function(originalCol){ 
     this.originalCol = originalCol; 
     this.on('add', this.addInOriginal, this); 
     this.on('remove', this.removeInOriginal, this); 
    }, 
    addInOriginal: function(model){ 
     this.originalCol.add(model); 
    }, 
    removeInOriginal: function(model){ 
     this.originalCol.remove(model); 
    }, 
    filterBy: function(params){ 
     var filteredColl = this.originalCol.filter(function(item){ 
      // filter code... 
     }); 
     this.reset(filteredColl); 
    } 
    }); 
+0

Cảm ơn rất nhiều vì câu trả lời. – chenglou

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