set: function (key, val, 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) {
this._pending = false;
this.trigger('change', this, options);
}
}
this._pending = false;
this._changing = false;
return this;
}
这里使用 while 循环,其实是为了在嵌套进行 set 时,能按顺序执行 change 响应,而不是嵌套的触发。下面是一段例子。
var model = new Backbone.Model();
model.on('change', function(){
console.log('before set');
model.set('b', 2);
console.log('after set');
})
model.set('a', 1);
如果 set 方法去掉if (changing) return this;
并把 while 改成 if 等,即按常规思路,一次 set 触发一次 change。上面的代码会打印:
before set
before set
after set
after set
可以看出来,第二次的 change 响应是嵌套在了第一次 change 响应中。改回 backbone 的处理,打印出来,就是顺序的 change 响应:
before set
after set
before set
after set