Skip to content

Instantly share code, notes, and snippets.

@shhider
Created August 25, 2017 10:44
Show Gist options
  • Save shhider/94ae045107c6ceebed48361ea2c0b38f to your computer and use it in GitHub Desktop.
Save shhider/94ae045107c6ceebed48361ea2c0b38f to your computer and use it in GitHub Desktop.
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment