为什么在 Backbone 的设置方法中有一个 while 循环
Why there is a while loop in Backbone's set method?
Github源代码
下面是 Backbone 的 set 方法的片段:
set: function(key, val, options) {
var attr, attrs, unset, changes, silent, changing, prev, current;
...
options || (options = {});
...
// Trigger all relevant attribute changes.
if (!silent) {
if (changes.length) this._pending = options;
for (var i = 0, length = changes.length; i < length; i++) {
this.trigger('change:' + changes[i], this, current[changes[i]], options);
}
}
// You might be wondering why there's a `while` loop here. Changes can
// be recursively nested within `"change"` events.
if (changing) return this;
if (!silent) {
while (this._pending) {
options = this._pending;
this._pending = false;
this.trigger('change', this, options);
}
}
this._pending = false;
this._changing = false;
return this;
}
尽管评论确实提到了我想知道的while
循环,但我看不出这个while循环是如何工作的,因为局部变量changing
将始终在一轮set
中true
。
谁能向我解释为什么会有一段时间以及何时生效?
提前感谢!
正如注释所说,"更改可以递归嵌套在"change"
事件中。
当触发"change"
事件(也称为再次调用set
)时,更新或重新设置模型上的某些属性并不是取消注释。_pending
属性只是为了确保在"change"
上更新的所有属性实际上都已更改。
看起来他们曾经检查是否有其他更改,以及是否有用于仅触发 1 个更改事件的骨干。这样做的问题是,如果有一个更新多个属性的更改事件的侦听器,则不会调用所有set
函数。有关具体示例,请参阅此单元测试。因此,while
循环处理的是 1 个侦听器多次调用set
的边缘情况,而不是多个侦听器,每个侦听器调用set
一次。就像上面链接的测试中的这个:
model.on('change:a', function() {
model.set({b: true});
model.set({b: true});
});
如果您对他们为什么将this._pending
更改为选项感到困惑,请查看此问题以及相关的拉取请求
相关文章:
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 如何在只能有一个asp.net表单的主页上从asp.net页面中的javascript中获取值
- 有可能在来自链接的警报中有一个值吗
- 是否<asp:文本框>有一个onFocusLost事件
- 让谷歌数据图表有一个24小时x轴
- PayPal按钮是否有一个简单的选项,其中金额基于一些用户输入
- 我确实有一个表单,如果用户输入了输入,它应该检查否定或空的输入框,并抛出一条警告消息
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- 当知道同一hiearch中至少有一个元素时,遍历到元素.结构使用jquery
- PNG图像被覆盖,但每个图像都有一个链接可以更改,每次一个-Javascript/jQuery/CSS
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- Regex或javascript每X个连续单词中有一个单词
- Jquery时间启动计时器,我有一个计时器的代码,但它在页面加载时启动
- 是否有一个javascript库来解析简单的查询
- 在一个函数中,我有一个未捕获的语法错误:意外的标记else
- 检查一个元素是否有一个类与另一个类总是返回true
- 我有一个用幻灯片制作的网页,但幻灯片会在屏幕上移动
- 我制作html网站的一小部分——我有一个javascript部分
- Javascript动态表,每个单元格都有一个onmouse事件
- 为什么在 Backbone 的设置方法中有一个 while 循环