簡體   English   中英

被綁定到 Backbone 觸發事件的函數阻塞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM