Как этот Javascript создает впечатление, что событие, инициированное одним классом, также запускается из другого класса?

Я работаю с библиотекой под названием RiotControl, а также RiotControl содержит коллекцию Store экземпляров. Он также подключает некоторые слушатели событий в каждом магазине, который к нему добавлен:

https://github.com/jimsparkman/RiotControl/blob/master/demo/todo.tag#L31

var RiotControl = {
  _stores: [],
  addStore: function(store) {
    this._stores.push(store)
  }
}

['on','one','off','trigger'].forEach(function(api){
  RiotControl[api] = function() {
    var args = [].slice.call(arguments)
    this._stores.forEach(function(el){
      el[api].apply(null, args)
    })
  }
})

Store наблюдает и запускает события на себя:

https://github.com/jimsparkman/RiotControl/blob/master/demo/todostore.js#L21

function TodoStore() {
  ...
  self.on('todo_add', function(newTodo) {
    self.todos.push(newTodo) 
    self.trigger('todos_changed', self.todos)        
  })
}

В приведенном выше примере магазин будет запускать todos_changed Событие само по себе. Тем не менее, это событие также можно наблюдать на RiotControl объект:

https://github.com/jimsparkman/RiotControl/blob/master/demo/todo.tag#L31

// Register a listener for store change events.
RiotControl.on('todos_changed', function(items) {
  self.items = items
  self.update()
})

Мне неясно, как это событие наблюдается на RiotControl когда он уволен из Store, Насколько я могу сказать, RiotControl, в forEach цикл, будет отправлять события, которые запускаются на нем, в каждое хранилище, которым он управляет, и именно поэтому TodoStore можно наблюдать self.on('todo_add'), Я не могу понять, как self.trigger('todos_changed') пузыри до RiotControl хотя так, что это также можно наблюдать там. У кого-нибудь есть идеи?

1 ответ

Событие можно наблюдать в RiotControl и запускать через self потому что он был добавлен в RiotControl через RiotControl.addStore(todoStore), который добавляет это к _stores а потом applys все, что было призвано self или же RiotControl потом.

(см. https://github.com/jimsparkman/RiotControl/blob/master/demo/index.html).

Другие вопросы по тегам