在我的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()方法调用所源自的源视图,而不是在每个回调中实现检查,我认为在模型本身处理这个更有意义。这可能吗?
答案 0 :(得分:1)
我认为'适当的' MCV解决方案是您的视图不应该知道或关心模型如何更改,他们应该只是处理更改并相应地更新。如果它们已经是最新的,则用户不应该知道其中的差异。
我绝对不会将源视图传递给模型。相反,当模型更改时,您可以让视图检查它是否是当前的而不是重新渲染。但如果额外的渲染没有引起任何问题,那就让它发生吧:)
在Backbone中,'视图'是视图和控制器。因此,请尝试将更改视为两个单独的步骤。首先,将用户输入转换为模型上的更改,然后作为单独的步骤(由模型更改事件启动),处理该更改并更新视图。如果每个视图都这样做,无论模型如何变化,一切都将保持最新。