2

我正在使用一个名为 的库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)
    })
  }
})

AStore观察并触发自己的事件:

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()
})

我不清楚RiotControlStore. 据我所知,RiotControlforEach循环中,将在其上触发的事件调度到它管理的每个商店,这就是为什么TodoStore可以观察self.on('todo_add')。我无法弄清楚self.trigger('todos_changed')气泡是如何RiotControl形成的,因此在那里也可以观察到。有人知道吗?

4

1 回答 1

0

该事件在 RiotControl 上是可观察的,并且可以通过触发,self因为它是通过添加到 RiotControl 的RiotControl.addStore(todoStore),这会将其添加到_stores任何applys被调用的内容中selfRiotControl之后。

(见https://github.com/jimsparkman/RiotControl/blob/master/demo/index.html#L31

于 2015-08-10T01:16:24.483 回答