Bra*_*och 11 javascript backbone.js
我正在构建一个通用的Backbone视图来管理多个子视图.我有时需要执行逻辑来在渲染之前准备这些视图.我正在考虑使用Backbone事件来启用pre_render钩子,如下所示:
view = new (this.child_view);
this.trigger('pre_render', view);
view.render();
Run Code Online (Sandbox Code Playgroud)
调用的事件是否trigger()会同步执行,从而保证在render()调用线路之前它们都将完成?
voi*_*hos 12
基本上,是的,它是同步的.
以下是来源的相关部分:
trigger: function(name) {
if (!this._events) return this;
var args = slice.call(arguments, 1);
if (!eventsApi(this, 'trigger', name, args)) return this;
var events = this._events[name];
var allEvents = this._events.all;
if (events) triggerEvents(this, events, args);
if (allEvents) triggerEvents(this, allEvents, arguments);
return this;
},
Run Code Online (Sandbox Code Playgroud)
导入功能triggerEvents实际上是调用处理程序.根据评论,它只是一个优化的调度员.请注意,他们都在呼吁.call()和.apply(),因此控制交回给调用者之前,回调将完成.
var triggerEvents = function(obj, events, args) {
var ev, i = -1, l = events.length;
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, args[0]);
return;
case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]);
return;
case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]);
return;
default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
}
};
Run Code Online (Sandbox Code Playgroud)
但是,正如其他人所提到的,触发处理程序可以自由地安排自己的回调,如果它们如此倾向.因此,处理程序在返回之前是否已完成其工作取决于处理程序代码本身.
| 归档时间: |
|
| 查看次数: |
3007 次 |
| 最近记录: |