2011-10-25 9 views
22

Tôi có mô hình Bài đăng và bộ sưu tập Bài đăng. Và muốn tạo biểu mẫu với danh sách tất cả các bài đăng trong <select id="multi" multiple="multiple">. Vì vậy, tôi phải thực hiện một PostView render bên trong #multi của tôi chỉ với mẫu này:Backbone.js tắt quấn bởi div trong kết xuất

<option value=""><%= title %></option> 

Nhưng cuối cùng tôi nhận được nó được bọc bằng div. Có giải pháp nào cho việc không gói mẫu này với <div> không?

Trả lời

32

Nếu bạn không xác định el (hoặc tagName) cho chế độ xem (trong lớp hoặc trong quá trình khởi tạo), chế độ xem sẽ được đặt bên trong thẻ div. http://documentcloud.github.com/backbone/#View-el

var PostView = Backbone.View.extend({ 
    tagName: 'option' 
}); 

CẬP NHẬT

Bắt đầu v0.9.0, Backbone có view.setElement (element) để thực hiện điều này.

var PostView = Backbone.View.extend({ 
    initialize: function() { 
     var template = _.template('<option value=""><%= title %></option>'); 
     var html = template({title: 'post'}); 
     this.setElement(html); 
    } 
}); 
+1

Tôi cũng đã thử phương pháp này, nhưng không thể thấy cách chuyển biến cho "giá trị" bên trong thẻ

+0

Bên trong khung nhìn của bạn, bạn có thể sử dụng jquery để đặt giá trị '$ (this.el) .attr ('value', 'something');' – kreek

+4

hoặc thậm chí 'this.el.value = 'something'' để jQuery ở đâu nó cần thiết :) –

18

Nếu bạn không muốn có quan điểm quấn HTML của bạn, bạn sẽ phải làm một vài điều:

  1. Thay this.el hoàn toàn
  2. Gọi delegateEvents trên mới el
render: function(){ 
    var html = "some foo"; 
    this.el = html; 
    this.delegateEvents(this.events); 
} 

Vì xương sống tạo ra div hoặc thẻ khác (dựa trên cài đặt tagName cho chế độ xem), bạn phải thay thế hoàn toàn thẻ đó. Thật dễ dàng để làm. Khi bạn làm điều đó, mặc dù, bạn mất các sự kiện được khai báo của bạn bởi vì Backbone sử dụng jQuery delegate dưới mui xe để dây chúng lên. Để bật lại các sự kiện đã khai báo của bạn, hãy gọi delegateEvents và chuyển vào các tuyên bố sự kiện của bạn.

Kết quả là view.el của bạn sẽ là thẻ <option> mà bạn muốn và không có gì khác.

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn, Derick. Tôi sẽ sử dụng lời khuyên của bạn trong các dự án tương lai của tôi/ – BazZy

+0

bạn không phải chuyển thông tin này.đến delegateEvents, nó sẽ mặc định. – troynt

+8

có một chức năng cho việc này trong phiên bản BB mới nhất - [view.setElement (html)] (http://documentcloud.github.com/backbone/#View-setElement) – zihotki