如果View本身通过Backbone.Model.set()更新模型,请不要调用render()

时间:2013-02-10 14:40:23

标签: backbone.js backbone-views backbone-events backbone-model

在我的Backbone.js项目中,我有一个模型和几个视图。所有视图都在此模型上注册了'change:currentTextTitle'的回调:

// 'this' stands for any of the Views here
myModel.on('change:currentTextTitle', this.render, this); 

现在用户执行一些操作,这会导致特定的视图更改其“当前文本标题”字段。然后,此特定视图会调用myModel.set("currentTextField", newTextValue),而'change:currentTextTitle'会触发render事件,调用所有视图(包括发起set()的视图)。然后所有视图调用其render回调函数。

问题是在最初调用set() - Method的View上调用了currentTextTitle方法,这完全没必要,因为它已经与{{1}更新了}。

我的视图如何调用myModel.set()以及其他视图'回调获取通知的方式,但不触发/调用“源视图”本身?

一种解决方法似乎是将源视图作为options方法的set()参数的一部分传递(将其传递到trigger(),然后传递到{{1}回调):

render()

然后在myModel.set("currentTextField", newTextValue, thisViewSetAttribute) 回调中,可以检查是否render。但是,我认为通过调用必要的回调并忽略set()方法调用所源自的源视图,而不是在每个回调中实现检查,我认为在模型本身处理这个更有意义。这可能吗?

1 个答案:

答案 0 :(得分:1)

我认为'适当的' MCV解决方案是您的视图不应该知道或关心模型如何更改,他们应该只是处理更改并相应地更新。如果它们已经是最新的,则用户不应该知道其中的差异。

我绝对不会将源视图传递给模型。相反,当模型更改时,您可以让视图检查它是否是当前的而不是重新渲染。但如果额外的渲染没有引起任何问题,那就让它发生吧:)

在Backbone中,'视图'是视图和控制器。因此,请尝试将更改视为两个单独的步骤。首先,将用户输入转换为模型上的更改,然后作为单独的步骤(由模型更改事件启动),处理该更改并更新视图。如果每个视图都这样做,无论模型如何变化,一切都将保持最新。