Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js Don';如果视图本身通过Backbone.Model.set()更新了模型,则不调用render()_Backbone.js_Backbone Views_Backbone Events_Backbone Model - Fatal编程技术网

Backbone.js Don';如果视图本身通过Backbone.Model.set()更新了模型,则不调用render()

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

在我的Backbone.js项目中,我有一个模型和几个视图。所有视图都注册了此模型上的
'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)