2013-04-27 16 views
17

Tôi đã cấu trúc xương sống sau:Nghe một thay đổi thuộc tính cụ thể trong một mô hình trong một bộ sưu tập lồng nhau trong Backbone

- collection[order_items] 
    - collection[menu_items] 
     - price 
     - quantity 

và tôi muốn lắng nghe bất kỳ thay đổi trong các thuộc tính số lượng, tôi đã nhận nó làm việc bằng cách

var CheckoutView = Backbone.Marionette.ItemView.extend({ 

    template: '#template-checkout', 

    initialize: function (options) { 
     this.order_collection = options.collection; 
     _(this.order_collection.models).each(function (element, index, list) { 
      this.listenTo(element.get("menu_items"), "change:quantity", this.onOrderItemsChanged); 
     }, this); 

    }, 

    onOrderItemsChanged: function (model, val, options) { 
     console.log(model.get("name")); 
    } 

}); 

Nhưng liệu con rối hoặc xương sống có một cách tốt hơn để làm việc đó, thay vì lặp nghĩ các bộ sưu tập phụ huynh và thêm người nghe cho mỗi bộ sưu tập con, có lẽ cái gì đó như

this.listenTo(this.order_collection, "change:menu_items:quantity", this.on OrderItemsChanged)

(mà didnt làm việc cho tôi)

Trả lời

6

Hãy xem Backbone.DeepModel. Rõ ràng, bạn có thể đại diện cho Đơn đặt hàng dưới dạng một mô hình duy nhất có cấu trúc sâu và lắng nghe hoặc là change:order_items.*.menu_items.* hoặc change:order_items.menu_items.*. Lưu ý rằng giải pháp này ngăn bạn sử dụng lợi ích của các danh sách lồng nhau như Backbone.Collection. Tôi nghĩ rằng đó là một sự cân bằng tốt, nhưng số dặm của bạn có thể thay đổi

-8

Bộ sưu tập xương sống có các sự kiện riêng của nó như các mô hình Backbone. Bạn chỉ cần gắn kết sự kiện trong bộ sưu tập của bạn và tất cả các mô hình bên trong nó sẽ lắng nghe nó. Ví dụ:

this.order_collection.models.on('change:quantity', function(model, updatedQuantity) { 
    alert("Changed quantity from " + model.previous("quantity") + " to " + updatedQuantity);); 
}); 

Vì vậy, các sự kiện được kích hoạt trên mô hình trong bộ sưu tập cũng sẽ được kích hoạt trên bộ sưu tập.

+8

Rất tiếc, tôi không thấy cách hoạt động của tính năng này. 'Collection.models' là một Array thô và Array không có phương thức' on'. Tui bỏ lỡ điều gì vậy? – ericsoco

+0

@ericosoco đúng, điều này không hiệu quả và tôi không thấy nó hoạt động như thế nào. – dvdplm

+2

Đồng ý - Tôi nghĩ rằng điều này sẽ được cập nhật thành "this.order_collection.on" thay vì .models.on. –