Tóm tắt: đặt động các thuộc tính chế độ xem với dữ liệu mô hình
http://jsfiddle.net/5wd0ma8b/
var View = Backbone.View.extend( {
attributes : function () {
return {
class : this.model.get( 'item_class' ),
id : this.model.get( 'item_id' )
};
}
} );
var item = new View( {
model : new Backbone.Model( {
item_class : "nice",
item_id : "id1"
} )
} );
Ví dụ này giả định rằng bạn đang cho phép Backbone tạo phần tử DOM cho bạn.
Các attributesphương pháp được gọi là sau khi các thuộc tính truyền cho constructor xem được thiết lập (trong trường hợp này, model), cho phép bạn tự động thiết lập các thuộc tính với các dữ liệu mô hình trước khi Backbone tạo el.
Ngược lại với một số câu trả lời khác: không mã cứng các giá trị thuộc tính trong lớp chế độ xem, tự động đặt chúng từ dữ liệu mô hình; không đợi cho đến khi render()đặt vals attr; không liên tục đặt vals attr trong mọi cuộc gọi đến render(); không đặt thủ công vals trên phần tử DOM một cách không cần thiết.
Lưu ý rằng nếu thiết lập lớp khi gọi Backbone.View.extendhoặc một phương thức xây dựng dạng xem (ví dụ new Backbone.View), bạn phải sử dụng tên thuộc tính DOM className, nhưng nếu đặt nó qua attributesphương thức băm / (như trong ví dụ này), bạn phải sử dụng tên thuộc tính , class.
Kể từ Backbone 0.9.9:
Khi tuyên bố chế độ xem ... el, tagName, idvà classNamenay có thể được định nghĩa là chức năng, nếu bạn muốn giá trị của chúng được xác định tại thời gian chạy.
Tôi đề cập đến điều này trong trường hợp có một tình huống mà nó sẽ hữu ích như một sự thay thế cho việc sử dụng một attributesphương pháp như được minh họa.
Sử dụng một phần tử hiện có
Nếu bạn đang sử dụng một phần tử hiện có (ví dụ: chuyển eltới phương thức tạo khung nhìn) ...
var item = new View( { el : some_el } );
... thì attributessẽ không được áp dụng cho phần tử. Nếu các thuộc tính mong muốn chưa được đặt trên phần tử hoặc bạn không muốn sao chép dữ liệu đó trong lớp chế độ xem của mình và một vị trí khác, thì bạn có thể muốn thêm một initializephương thức áp dụng attributescho hàm tạo chế độ xem của mình el. Một cái gì đó như thế này (sử dụng jQuery.attr):
View.prototype.initialize = function ( options ) {
this.$el.attr( _.result( this, 'attributes' ) );
};
Sử dụng el, hiển thị, tránh trình bao bọc
Trong hầu hết các ví dụ tôi đã thấy, el của chế độ xem đóng vai trò như một phần tử bao bọc vô nghĩa bên trong mà người ta phải viết mã 'ngữ nghĩa' theo cách thủ công.
Không có lý do gì view.elcần phải là "một phần tử bao bọc vô nghĩa". Trên thực tế, điều đó thường sẽ phá vỡ cấu trúc DOM. Nếu một lớp dạng xem đại diện cho một <li>phần tử chẳng hạn, nó cần được hiển thị dưới dạng một <li>- việc hiển thị nó dưới dạng một <div>hoặc bất kỳ phần tử nào khác sẽ phá vỡ mô hình nội dung. Bạn có thể sẽ muốn tập trung vào việc thiết một cách chính xác lên yếu tố của quan điểm của bạn (sử dụng tài sản như tagName, classNamevà id) và sau đó render nó nội dung sau đó.
Các tùy chọn về cách để các đối tượng dạng xem Backbone của bạn tương tác với DOM rất rộng mở. Có 2 kịch bản ban đầu cơ bản:
Bạn có thể đính kèm một phần tử DOM hiện có vào một khung nhìn Backbone.
Bạn có thể cho phép Backbone tạo một phần tử mới bị ngắt kết nối khỏi tài liệu, sau đó bằng cách nào đó chèn nó vào tài liệu.
Có nhiều cách khác nhau để bạn có thể tạo nội dung cho phần tử (đặt một chuỗi ký tự, như trong ví dụ của bạn; sử dụng thư viện tạo mẫu như Mustache, Handlebars, v.v.). Bạn nên sử dụng thuộc eltính của chế độ xem như thế nào tùy thuộc vào việc bạn đang làm.
Yếu tố hiện có
Ví dụ kết xuất của bạn cho thấy rằng bạn có một phần tử hiện có mà bạn đang gán cho dạng xem, mặc dù bạn không hiển thị phần khởi tạo của dạng xem. Nếu đúng như vậy và phần tử đã có trong tài liệu, thì bạn có thể muốn làm điều gì đó như thế này (cập nhật nội dung của el, nhưng không thay đổi elchính nó):
render : function () {
this.$el.html( "Some stuff" );
}
http://jsfiddle.net/vQMa2/1/
Phần tử đã tạo
Giả sử bạn không có một phần tử hiện có và bạn cho phép Backbone tạo một phần tử cho bạn. Bạn có thể muốn làm điều gì đó như thế này (nhưng tốt hơn là nên kiến trúc mọi thứ để chế độ xem của bạn không có trách nhiệm biết về bất cứ điều gì bên ngoài chính nó):
render : function () {
this.$el.html( "Some stuff" );
$( "#some-container" ).append( this.el );
}
http://jsfiddle.net/vQMa2/
Mẫu
Trong trường hợp của tôi, tôi đang sử dụng các mẫu, ví dụ:
<div class="player" id="{{id}}">
<input name="name" value="{{name}}" />
<input name="score" value="{{score}}" />
</div>
<!-- .player -->
Mẫu đại diện cho chế độ xem hoàn chỉnh. Nói cách khác, sẽ không có trình bao bọc xung quanh mẫu - div.playersẽ là phần tử gốc hoặc phần tử ngoài cùng của chế độ xem của tôi.
Lớp người chơi của tôi sẽ trông giống như thế này (với ví dụ rất đơn giản về render()):
Backbone.View.extend( {
tagName : 'div',
className : 'player',
attributes : function () {
return {
id : "player-" + this.model.cid
};
},
render : function {
var rendered_template = $( ... );
this.$el.empty().append( rendered_template.children() );
}
} );