假设我有这样一个代码:
view1.listenTo(model, 'change', function(){
console.log('test1');
});
view2.listenTo(model, 'change', function(){
console.log('test2');
});
“test1”总是会首先打印吗?
假设我有这样一个代码:
view1.listenTo(model, 'change', function(){
console.log('test1');
});
view2.listenTo(model, 'change', function(){
console.log('test2');
});
我不知道有任何一种情况下监听器的工作方式会有所不同。我已经阅读了backboneJs的代码以确保,我已经看到listenTo将回调推入一个数组中。当事件被触发时,它循环包含事件回调的数组。
var triggerEvents = function (events, args) {
var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
switch (args.length) {
case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
}
};
我认为你可以确定它不会改变。事件总是以这种方式工作。当事件发生时(this.model.trigger("change")或this.model.set("...")),回调按照它们被定义的顺序启动,当回调启动时,执行继续在模型修改的下一行。
正如@Daniel所指出的,文档并没有说明事件排序方面的特殊要求。
根据我的个人经验,我从未见过事件以随机顺序触发。
这个可运行的演示DEMO证实了这一点。
Demo代码:
var Person = Backbone.Model.extend({
initialize: function(){
console.log("Welcome to this world");
}
});
var person = new Person({ name: "Thomas", age: 67, child: 'Ryan'});
var headerView = Backbone.View.extend({
initialize: function() {
this.listenTo(person, 'change', function(){
console.log('test1');
});
this.listenTo(person, 'change', function(){
console.log('test2');
});
this.listenTo(person, 'change', function(){
console.log('test3');
});
this.listenTo(person, 'change', function(){
console.log('test4');
});
this.listenTo(person, 'change', function(){
console.log('test6');
});
this.listenTo(person, 'change', function(){
console.log('test7');
});
}
});
new headerView();
setInterval(function(){
person.unset('attr');
person.set({'attr': 'value'});
},1000)
就目前的实现来说,我会说是的。然而,文档并没有说明这一点,而且这个情况随时可能发生变化。