Как этот 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).