2012-02-15 37 views
8

tôi có một cái nhìn mà làm cho bản thân từ một Bộ sưu tập:backbone.js: thêm một yếu tố để một bộ sưu tập mà không cần render tất cả các bộ sưu tập

render: function() { 

    $(this.el).html(JST['templates/menu']({collection: this.collection })); 
    $('#nav').html(this.el);  
} 

Trong giao diện khởi tạo, tôi ràng buộc sự kiện thêm của bộ sưu tập về chức năng hiển thị của chế độ xem:

initialize: function() { 
    this.render(); 
    var self = this; 
    this.collection.bind("add", function(event){ 
     self.render(); 
    }); 
} 

ở nơi khác trong ứng dụng, tôi thêm một mục vào bộ sưu tập.

bookSubscription_collection.add(model); 

Vấn đề với mã được, nếu tôi thêm một mục mới vào bộ sưu tập, sau đó tất cả các mục trong bộ sưu tập được tái-rendered.

Có cách nào để thêm mục mới vào bộ sưu tập mà không trả lại tất cả các mục khác nhưng chỉ hiển thị mục mới?

Trả lời

3

Thay vì ràng buộc sự kiện thêm của bộ sưu tập vào hàm kết xuất, hãy liên kết nó với một số hàm khác chấp nhận mô hình được thêm vào và sửa đổi DOM với dữ liệu từ mô hình được thêm vào.

+0

cảm ơn bạn, tôi sẽ cố gắng mà tối nay! –

4

Đây là phiên bản đơn giản về cách tôi đang thực hiện. reset thêm tất cả các mô hình vào giao diện người dùng và add thêm một mô hình duy nhất vào giao diện người dùng. addAll về cơ bản có một vòng lặp gọi là addOne cho mỗi mô hình. Nó có lẽ có thể được tối ưu hóa tốt hơn nhưng nó hoạt động đủ tốt.

initialize: function() { 
    _.bindAll(this, 'render', 'addOne', 'addAll'); 

    leads.bind('add', this.addOne, this); 
    leads.bind('reset', this.addAll, this); 
    }, 
    render: function() { 
    this.addAll(); 
    return this; 
    }, 
    addOne: function(model) { 
    // add the model to HTML 
    }, 
    addAll: function(options) { 
    leads.each(this.addOne); 
    return this; 
    } 
+0

Bất kỳ cải tiến nào về điều này, nơi mà việc chèn HTML thực tế được gọi một lần nếu thêm tức là. 10 mô hình? –

0

abraham đã viết một ví dụ điển hình. Ive cũng đã sử dụng nó như thế này

initialize: ->  
    self = @ 
    @model.bind "add", (task) -> 
    $(self.el).append new app.TaskIndexItemView(model: task).render().el 

nhưng tôi nghĩ rằng addOne là giải pháp tốt hơn

+1

tại sao 'self = @'? nó giống nhau mà không có nó và bạn nên sử dụng chất béo mũi tên => cho phạm vi ràng buộc sau đó thay vì làm '$ (self.el)' bạn có thể làm '$ (@ el)' hoặc nếu bạn đang sử dụng xương sống 0.9+ bạn nên sử dụng ' @ $ el' sử dụng jQuery được lưu trong bộ nhớ cache của 'this.el' –

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