Javascript RiotJS+;RiotControl如何为一个RiotStore确定事件范围

Javascript RiotJS+;RiotControl如何为一个RiotStore确定事件范围,javascript,riot.js,Javascript,Riot.js,使用两个不同的RiotControl存储在两个相似的Riot组件上确定事件范围的最佳方法是什么 现在,无论按下哪个按钮,操作都应用于两个标记,因为控件存储是全局的。我正试图找出哪种方法是最好的方法,可以为每家商店定义一个标签 我的实际用例将有多个嵌套标记,因此传递存储可能并不理想 我在以下网站上树立了一个榜样: 我的标签: <script type="riot/tag"> <play> <button onclick={ toggle }>{op

使用两个不同的RiotControl存储在两个相似的Riot组件上确定事件范围的最佳方法是什么

现在,无论按下哪个按钮,操作都应用于两个标记,因为控件存储是全局的。我正试图找出哪种方法是最好的方法,可以为每家商店定义一个标签

我的实际用例将有多个嵌套标记,因此传递存储可能并不理想

我在以下网站上树立了一个榜样:

我的标签:

<script type="riot/tag">
  <play>
    <button onclick={ toggle }>{opts.name}</button>
    <p name="status">unclicked</p>
      var self = this   

      RiotControl.on('play', function() {
        self.status.innerText = "clicked"
      })

      toggle(e) {
        RiotControl.trigger('play_toggle')           
      }
  </play>
</script>

到目前为止,我提出的最优雅的解决方案是创建一个全局Mixin,它根据根元素上的属性或其id为所有控件定义一个作用域

var ScopeMixin = {
  // init method is a special one which can initialize
  // the mixin when it's loaded to the tag and is not
  // accessible from the tag its mixed in
  init: function() {
    this.scope = this.getScope();
  },

  getScope: function() {
    var root = this
    while (root.parent) {
      root = root.parent
    }

    return root.opts.scope || root._riot_id
  }
}
这与每个触发器结合在一起,以包含一个范围

toggle(e) {
    RiotControl.trigger('play_toggle', { scope: self.scope })           
}

我使用的一种方法是

  • 新建存储时,请为它们命名名称空间/作用域。
    
    var controlStoreOne=new ButtonControlStore({namespace1})
    var controlStoreTwo=新按钮controlstore({namespace2})
    

    存储区被编码以监听名称空间的事件。
    
    self.on(self.namespace+':'+'play_toggle',函数(ack){
    自我触发(确认evt,确认,'play')
    })
    

    i、 e.当你为他们控制一个事件时,它是RiotControl.trigger({namespace1}:play_toggle',ack)

  • 传递确认对象
    
    { 
    evt:“{my listener}”,
    外部数据:{}
    }
    
    存储被编码为在传入的事件名称上触发。因此,不要盲目地触发某些硬编码的事件名称。
    然后,我的商店会对这样的事情做出回应。
    
    触发器(ack.evt,ack,{存储区生成的数据})
    
  • 最后,你的商店是有范围的,他们只向任何想要的人发射事件

    toggle(e) {
        RiotControl.trigger('play_toggle', { scope: self.scope })           
    }