2013-02-19 53 views
0

我有以下骨干视图。我有疑问。在模型被删除的情况下,我在取消之后调用渲染(第一种方法),另一种方法是在视图内部有一个初始化函数,它使模型监听事件​​的变化。 )取消后的主干渲染

有人请让我知道,一和二之间的区别。至于哪两个更好。

第一种方法 变种AppointmentView = Backbone.View.extend({ 模板:_.template(“ '>' + '<%=标题%>' + 'X'),

events: { "click a": "cancel" }, 
    cancel: function(){ 
    this.model.cancel(); 
    this.render(); // rendering after cancel 
    }, 
    render: function(){ 
    this.$el.html(this.template(this.model.toJSON())); 
    } 
}); 

第二种方法

var AppointmentView = Backbone.View.extend({ 
    template: _.template('<span class="<% if(cancelled) print("cancelled") %>">' + 
         '<%= title %></span>' + 
         '<a href="#">x</a>'), 
    initialize: function(){ 
    this.model.on("change", this.render, this); 
    }, 
    events: { "click a": "cancel" }, 
    cancel: function(){ 
    this.model.cancel(); 
    }, 
    render: function(){ 
    this.$el.html(this.template(this.model.toJSON())); 
    } 
}); 
+0

你对模型做了什么取消方法?因为你不能通过调用模型本身的方法来删除一个模型(没有意义),或者反过来提出问题......你想达到什么目的?在模型从集合中移除之后模型发生变化或呈现后的渲染? – Drejc 2013-02-19 08:37:27

+0

@Drejc,'Model#destroy'是一个通过调用模型的方法从集合中移除模型的方法示例。只是说。 – jevakallio 2013-02-19 09:37:44

+0

因此无论哪种方式,您都需要通过直接或间接删除模型来通知集合该模型不再存在。 – Drejc 2013-02-19 12:04:29

回答

0

我会定义一个定制cancelled事件,从您的cancel方法触发该事件,并绑定到视图中的该事件。

var Appointment = Backbone.Model.extend({ 
    cancel: function() { 
    //cancellation code... 
    this.trigger('cancelled', this); 
    } 
}); 

var AppointmentView = Backbone.Model.extend({ 
    initialize: function() { 
    this.listenTo(this.model, 'cancelled', this.render); 
    } 
}); 

这样,你的观点会重新渲染,即使模型是从比视图本身的其他地方取消,但你仍然可以在特定的行为或只能重新呈现在cancel,而不是在每一个变化。