[英]Blocking by functions bound to Backbone triggered events
如果我有一個綁定到 Backbone 對象事件的函數,是否會從另一個上下文塊程序流觸發該事件,直到綁定的函數執行完畢?
例如,一組待辦事項:
class App.Collections.Todos extends Backbone.Collection
model: App.Models.Todo
initialize: ->
@collection.on 'will_change:selected', @logUnselection, this
@collection.on 'change:selected', @logSelection, this
logUnselection: (todo) ->
for t in @collection.models
console.log "unselected!"
logSelection: (todo) ->
console.log "selected!"
單個待辦事項的視圖是這樣的:
class App.Views.Todo extends Backbone.View
events:
'click': 'select'
select: (e) ->
@model.collection.trigger('will_change:selected', @model)
@model.set(selected: true)
當點擊一個待辦事項時,輸出總是像這樣,無論logUnselection
的代碼執行多長時間?
unselected!
unselected!
unselected!
unselected!
...
unselected!
selected!
或者在事件觸發綁定函數時繼續執行,可能導致:
unselected!
unselected!
selected!
unselected!
...
unselected!
觸發器將阻止執行。
從Backbone 的帶注釋的 source 中,這就是您調用 trigger 時發生的情況。 您可以看到 triggerEvents 函數只是執行此觸發器的注冊事件。
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(events, args);
if (allEvents) triggerEvents(allEvents, arguments);
return this;
},
...
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); return;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.