2011-07-22 35 views
10

Tôi đang cố gắng tìm hiểu backbone.js thông qua ví dụ sau đây. Sau đó, tôi bị kẹt tại điểmBackbone.js kết nối Xem với Mô hình

ItemView = Backbone.View.extend 

lý do bạn có thể sử dụng this.model.get? Tôi nghĩ rằng đây là đề cập đến trường hợp của ItemView sẽ được tạo ra. Vậy tại sao ItemView lại có một thuộc tính mô hình ở tất cả? !!

(function($){ 
     var Item = Backbone.Model.extend({ 
     defaults: { 
      part1: 'hello', 
      part2: 'world' 
     } 
     }); 

     var List = Backbone.Collection.extend({ 
     model: Item 
     }); 


var ItemView = Backbone.View.extend({ 

     tagName: 'li', 
     initialize: function(){ 
      _.bindAll(this, 'render'); 
     }, 
     render: function(){ 
      $(this.el).html('<span>'+this.model.get('part1')+' '+this.model.get('part2')+'</span>'); 
      return this; 
     } 
     }); 

     var ListView = Backbone.View.extend({ 
     el: $('body'), 
     events: { 
      'click button#add': 'addItem' 
     }, 
     initialize: function(){ 
      _.bindAll(this, 'render', 'addItem', 'appendItem'); 

      this.collection = new List(); 
      this.collection.bind('add', this.appendItem); 

      this.counter = 0; 
      this.render(); 
     }, 
     render: function(){ 
      $(this.el).append("<button id='add'>Add list item</button>"); 
      $(this.el).append("<ul></ul>"); 
      _(this.collection.models).each(function(item){ 
      appendItem(item); 
      }, this); 
     }, 
     addItem: function(){ 
      this.counter++; 
      var item = new Item(); 
      item.set({ 
      part2: item.get('part2') + this.counter 
      }); 
      this.collection.add(item); 
     }, 

     appendItem: function(item){ 
      var itemView = new ItemView({ 
      model: item 
      }); 
      $('ul', this.el).append(itemView.render().el); 
     } 
     }); 

     var listView = new ListView();  
    })(jQuery); 

Trả lời

5

Cách Backbone thực hiện kiến ​​trúc MVC, Chế độ xem có thể được đính kèm vào tập dữ liệu (Bộ sưu tập) cũng như các cá thể mô hình riêng lẻ. Mô hình thường represet hồ sơ lấy từ cơ sở dữ liệu nhưng trong triển khai tùy chỉnh có thể là bất kỳ đối tượng dữ liệu.

Như bạn thấy, đó là một câu hỏi rất rõ ràng khi bạn thực sự có một cái nhìn đại diện cho toàn bộ tập dữ liệu, vậy tại sao nó phải được tạo ra bằng cách lồng các khung nhìn, mỗi thể hiện một cá thể mô hình duy nhất. Nó không phải là cần thiết để làm những việc theo cách này. Bạn có thể có chế độ xem không lồng nhau đại diện cho toàn bộ tập dữ liệu tự cập nhật khi bất kỳ mục nào trong bộ sưu tập được thay đổi.

Nhưng bây giờ, hãy nghĩ ... sẽ thực sự có ý nghĩa khi hiển thị lại toàn bộ chế độ xem chỉ vì một thực thể duy nhất trong bộ sưu tập đã thay đổi. Giả sử bạn có một bộ sưu tập gồm hàng ngàn bản ghi đang được biểu diễn bằng chế độ xem dữ liệu. Bạn không nghĩ rằng việc kết xuất lại toàn bộ dữ liệu với mọi thay đổi trong bộ sưu tập sẽ làm tăng độ trễ của ứng dụng.

Vì vậy, trong nhiều trường hợp, có nhiều tùy chọn được ưu tiên hơn để có đối tượng xem lồng nhau theo cách ví dụ của bạn đã triển khai. Vì vậy, khi một cá thể mô hình đơn lẻ thay đổi, chế độ xem tương ứng phải được hiển thị lại và không phải toàn bộ chế độ xem tổng hợp.

Ngoài ra, nếu bạn muốn cung cấp cho người dùng, các thành phần giao diện người dùng hoạt động trên tập dữ liệu cũng như các phần tử riêng lẻ, thuận tiện hơn và hợp lý hơn để triển khai theo cách xem lồng nhau này. trên bộ dữ liệu ở cấp chế độ xem tổng hợp và các điều khiển cho các phần tử dữ liệu riêng lẻ ở cấp chế độ xem phần tử.

Hy vọng làm rõ câu hỏi của bạn.

+0

Cảm ơn bạn. Điều đó cho tôi sự rõ ràng –

-1

Mẫu là viết tắt của một mục trong danh sách, tập hợp là toàn bộ danh sách. Bạn đang tạo một listview cho bộ sưu tập và một itemview cho mục đó.

Cách bạn đặt câu hỏi của mình hơi kỳ quặc, tại sao nó lại gây nhầm lẫn cho bạn?

+0

Tôi tự hỏi 'this.model' trong' ListVIew' xuất phát từ đâu.Làm thế nào để xương sống biết mô hình của view này là 'Item'? –

5

Điều này tạo ra một phiên bản mới của một ListView và thêm thuộc tính mô hình. Bây giờ bạn có một mối quan hệ với mô hình và có thể sử dụng "this.model".

var view = new ListView({model: Item}); 

see also here

14

Mô hình này thường được truyền cho Xem dưới dạng một đối số nhà xây dựng như thế này.

var item = new Item(); 
var view = new ItemView({ model : item }); 

các thông số khác cũng có thể được chuyển đi, xem tài liệu tại http://backbonejs.org/#View.

-1

tôi nghĩ rằng đó là tự động xảy ra, bởi vì tên chế độ xem bắt đầu bằng tên mẫu và từ liên quan Xem

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