Có cách nào đơn giản để chèn một mục mô hình mới vào giữa một backbone.js Collection
và sau đó cập nhật bộ sưu tập của View
để bao gồm mục mới ở đúng vị trí không?Chèn một mục vào bộ sưu tập backbone.js
Tôi đang làm việc trên một điều khiển để thêm/xóa các mục khỏi danh sách. Mỗi mục danh sách có Model
và View
riêng của mình và tôi cũng có một số View
cho toàn bộ bộ sưu tập.
Mỗi chế độ xem mục có nút Duplicate
sao chép mô hình của mục và chèn vào bộ sưu tập ở vị trí chỉ mục bên dưới mục được nhấp.
Chèn mục vào bộ sưu tập rất đơn giản, nhưng tôi đang gặp khó khăn trong việc tìm cách cập nhật chế độ xem bộ sưu tập. Tôi đã thử một cái gì đó như thế này:
ListView = Backbone.View.extend({
el: '#list-rows',
initialize: function() {
_.bindAll(this);
this.collection = new Items();
this.collection.bind('add', this.addItem);
this.render();
},
render: function() {
this.collection.each(this.addItems);
return this;
},
addItem: function (item) {
var itemView = new ItemView({ model: item }),
rendered = itemView.render().el,
index = this.collection.indexOf(item),
rows = $('.item-row');
if (rows.length > 1) {
$(rows[index - 1]).after(rendered);
} else {
this.$el.append(rendered);
}
}
}
Triển khai này hoạt động nhưng tôi gặp phải lỗi lạ khi thêm một mục mới. Tôi chắc chắn rằng tôi có thể sắp xếp những người đó, nhưng ...
Có một giọng nói trong đầu tôi nói với tôi rằng có một cách tốt hơn để làm điều này. Có phải tự tìm ra nơi để chèn một ItemView
mới có vẻ thực sự hacky - không nên xem bộ sưu tập biết làm thế nào để rerender bộ sưu tập đã?
Mọi đề xuất?
Tôi đã phải thêm một cuộc gọi đến '(.item-row) .remove()' bên trong phương thức 'render' để làm việc này, nhưng đó là một giải pháp tốt. (Nếu không, các mục được hiển thị lại sẽ được thêm vào cuối các mục được hiển thị hiện có.) Cảm ơn bạn đã trợ giúp! –
Ồ, bạn chỉ có thể làm 'điều này. $ El.empty()' để xóa '$ el' trước khi lặp qua bộ sưu tập :) – sntran
Đó chính xác là cách tôi thêm các mục vào bộ sưu tập hiện tại. Nó đặt mục mới vào đúng vị trí trong bộ sưu tập.Tôi nhận thấy rằng tôi có một vài lỗi chính tả trong bình luận của mình ở trên: Tôi đang gọi '$ ('. Item-row'). Remove()' để xóa các mục đã được tạo lần cuối khi bộ sưu tập được hiển thị. Nó chỉ đặt lại chế độ xem. Hãy nghĩ về nó, có một phương pháp 'reset' có thể làm những gì tôi muốn. Tôi sẽ thử gọi nó và sau đó gọi 'render'. –