Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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
模型更改时的javascript/主干事件_Javascript_Events_Backbone.js - Fatal编程技术网

模型更改时的javascript/主干事件

模型更改时的javascript/主干事件,javascript,events,backbone.js,Javascript,Events,Backbone.js,在主干网中设计的应用程序在体系结构上有困难 我有级联的层次视图,即根视图有页眉、中间和页脚视图。每个视图都包含一些较低级别的视图,例如标题视图包含选项卡、首选项和登录/注销视图。这只是一个视图聚合 我还有一个配置模型,它有几个属性,通过AJAX(标准主干提取)加载。使用弹出窗口、菜单等在界面中显示模型属性,以便用户选择其设置。当用户更改设置时,可能需要重新渲染应用程序的许多部分。配置模型保存“状态”属性(例如,属性currentPeriod用于通过AJAX获取的时段) 在视图内部,我使用list

在主干网中设计的应用程序在体系结构上有困难

我有级联的层次视图,即根视图有页眉、中间和页脚视图。每个视图都包含一些较低级别的视图,例如标题视图包含选项卡、首选项和登录/注销视图。这只是一个视图聚合

我还有一个配置模型,它有几个属性,通过AJAX(标准主干提取)加载。使用弹出窗口、菜单等在界面中显示模型属性,以便用户选择其设置。当用户更改设置时,可能需要重新渲染应用程序的许多部分。配置模型保存“状态”属性(例如,属性
currentPeriod
用于通过AJAX获取的
时段

在视图内部,我使用
listenTo(this.model,'change:currentPeriod',this.render)
使此视图在配置中发生任何更改时重新渲染

我在模型中设置了所有默认状态属性::
parse
。问题是,如果我有10个属性要设置(解析结束后),并且可能每个属性都会触发一些事件,那么其中许多属性将运行多次(这不是我想要的)


我正在寻找一种可能性,用{silent:true}选项在parse中设置当前状态属性,这样就不会触发任何事件。我希望你们中的一些人已经有了同样的问题,并且存在一个简单的解决方案。提前谢谢

您可以触发所有事件“开始”/“一旦更改”,也可以不触发任何事件;换句话说,您可以传递
silent:true
,也可以不传递,但这是一个二进制选择。你不能说“设置foo,顺便说一句,只触发这个事件,而不是那个事件”

如果您想要那种级别的控制,我建议使用
silent:true
,然后手动触发您想要的事件


如果这对您不起作用,我建议更改绑定事件的方式,以便只绑定一次给定事件;这样就不会重复了。如果这不起作用,你可以让你的渲染方法工作,即使它运行多次;这样,事件可以多次触发render,但不会造成任何伤害。

获取期间,
选项的引用在
解析
设置
之间保持不变,因此您可以更改
选项的值。保持沉默
,更改将继续进行


例如,一种方法是创建一个代理(一个裸的
主干.Events
对象)并让您的视图监听它。代理对象将侦听模型上的
all
,并简单地将模型触发的事件排队(消除重复事件),直到模型触发“我完成了”事件(您将在
parse
结束时触发该事件);然后代理将触发所有排队事件并刷新队列。

我不确定问题是什么。您在调用
set
时提到使用
{silent:true}
,以防止发生更改事件;这不是你想要的吗?@freejosh,不。我可以使用x.set('xxx',value,{silent:true})。但是我在
parse
函数中需要相同的东西,在parse函数结束后返回值是
set
。或者如果有更好的解决方案,我会很感激。我想我有你写的最后一个选项,但我渲染的是一个有几百个节点的树,如果它被多次激发,需要花费很多时间。我正在考虑在
parse
函数中使用
this.attributes.currentPeriod=value
来“欺骗”主干,使其在首次初始化属性时不触发事件。你认为呢?这似乎是合理的,主干文档似乎鼓励这种方法:“请注意,[silent:true]很少,甚至可能永远都不是一个好主意。在选项中传递一个特定的标志以供事件回调查看并选择忽略,通常效果会更好。”还有一个想法:您还可以使用“重置”和“更改”事件来更好地针对某些处理程序。