2011-08-24 58 views
1

因此,我將此子模型與我的視圖的1個列表項關聯,當我編輯此模型時,視圖被正確呈現。子模型更改事件不會傳播到主幹模型中的父模型

但我也當了完整的列表模式的改變,並且改變事件不是在aprent水平,這是奇怪的射擊其他的事情做父母,

如果我手動火model.change()我見從子模型更新的內容(即有效更改的父模型)。

是否有一種自動方式將更改事件傳播到父模型?

+0

您能否提供一些代碼示例,說明您現在如何設置以及如何使其工作? –

回答

4

您的「父母」是子模型所屬的集合嗎?如果是這樣,則只要子模型的屬性發生更改,集合就會收到更改通知。以下是一個演示模型/收集變化事件的例子:

var Product = Backbone.Model.extend({}); 
var Products = Backbone.Collection.extend({ 
    model: Product 
}); 

var ProductsView = Backbone.View.extend({ 
    initialize: function() { 
     this.collection.bind('change', this.onProductChange, this); 
    }, 
    onProductChange: function (product) { 
     console.log('product with ID ' + product.get('id') + ' changed to ' + product.get('name')); 
    } 
}); 

var products = new Products([{ id: 1, name: 'Book' }, { id: 2, name: 'Toy' }, { id: 3, name: 'Shirt'}]); 
new ProductsView({collection:products}); 

products.get(1).set({ name: 'TV' }); // console: product with ID 1 changed to TV 

在另一方面,如果你的「父母」是不是你的子模型的集合,只是有一個父/子關係,然後骨幹有沒辦法瞭解關係,所以每當孩子發生變化時,您都需要觸發家長的變更事件。例如:

var Parent = Backbone.Model.extend({ 
     includeChild: function (child) { 
      child.bind('change', this.onChildChange, this); 
     }, 
     onChildChange: function (child) { 
      console.log('Child with name ' + child.get('name') + ' changed.'); 
     } 
    }); 
    var Child = Backbone.Model.extend({}); 

    var parent = new Parent(); 
    var child = new Child({ name: 'Bob', parent: parent }); 
    parent.includeChild(child); 

    child.set({name: 'Joe'}); // console: Child with name Joe changed. 

這裏的骨幹事件的完整列表:http://documentcloud.github.com/backbone/#FAQ-events

1

我喜歡JohnnyO的解決方案,我已經用自己的解決方案,以通用的「超級名模」類中我的應用程序。下面是這個類,它允許兒童模特的登記與父母的CoffeeScript的版本並自動傳播的所有事件:

class Model.SuperModel extends Backbone.Model 

    includeChild: (id, model) -> 
    @set id, model 
    @listenTo model, 'all', @trigger 

就是這樣。使用它很容易:

parent = new Model.SuperModel() 
parent.includeChild('child', new Backbone.Model()) 

view = new Backbone.View() 
view.listenTo(parent, 'change', -> console.log "parent changed!") 

parent.get('child').set('foo', 'bar') 

這將打印出「父母改變」,如你所料。