Backbone.js Don';如果视图本身通过Backbone.Model.set()更新了模型,则不调用render()
在我的Backbone.js项目中,我有一个模型和几个视图。所有视图都注册了此模型上的Backbone.js Don';如果视图本身通过Backbone.Model.set()更新了模型,则不调用render(),backbone.js,backbone-views,backbone-events,backbone-model,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”,n
'change:currentTextTitle'
回调:
// 'this' stands for any of the Views here
myModel.on('change:currentTextTitle', this.render, this);
现在,用户执行一些操作,这会导致特定视图更改其“当前文本标题”字段。该特定视图然后调用myModel.set(“currentTextField”,newTextValue)
,这反过来会触发调用所有视图(包括set()来源的视图)的'change:currentTextTitle'
事件。然后所有视图调用它们的render
回调函数
问题是在最初调用set()方法的视图上也调用了render
方法,这完全没有必要,因为它已经是currentTextTitle
的最新版本
我的视图如何调用myModel.set(),以通知其他视图的回调,但不触发/调用“源视图”本身
一种解决方法似乎是将源代码视图作为set()
方法的options
参数的一部分传递(该参数传递给trigger()
然后传递给render()
回调):
然后在
render
回调中,可以检查thisViewSetAttribute!=这是
。但是,我认为,与其在每个回调中实现检查,不如在模型本身中处理这个问题,只调用必要的回调,忽略set()方法调用的源视图。这可能吗?我认为“合适的”MCV解决方案是,您的视图不应该知道或关心模型如何更改,他们应该简单地处理更改并相应地更新。如果它们已经是最新的,用户不应该知道它们之间的区别
我绝对不会将源代码视图传递给模型。相反,当模型更改时,您可以让视图检查它是否为当前视图,而不是重新渲染。但是如果额外的渲染没有引起任何问题,那么就让它发生:)
在主干网中,“视图”既是视图又是控制器。因此,试着将更改视为两个独立的步骤。首先,将用户输入转换为模型上的更改,然后作为一个单独的步骤(由模型更改事件启动),处理该更改并更新视图。如果每个视图都这样做,无论模型如何更改,所有内容都将保持最新
myModel.set("currentTextField", newTextValue, thisViewSetAttribute)