Ember:嵌套组件事件冒泡

Posted

技术标签:

【中文标题】Ember:嵌套组件事件冒泡【英文标题】:Ember: nested components events bubbling 【发布时间】:2014-07-26 06:36:22 【问题描述】:

我创建了一组嵌套组件。

代码在这里:http://emberjs.jsbin.com/hasehija/2/edit。

html

#level-1
    #level-2
      #level-3
        <button action 'handleAction'>
          Click me (yielded)
        </button>
      /level-3
    /level-2
 /level-1

JS:

App.ApplicationController = Ember.Controller.extend(
  actions: 
    handleAction: function() 
      alert('Handled in ApplicationController');
    
  
);

App.Level1Component = Ember.Component.extend(
  actions: 
    handleAction: function() 
      alert('Handled in Level 1');
    
  
);

App.Level2Component = Ember.Component.extend(
  actions: 
    handleAction: function() 
      alert('Handled in Level 2');
    
  
);

App.Level3Component = Ember.Component.extend(
  actions: 
    handleAction: function() 
      alert('Handled in Level 3');
      this.set('action', 'handleAction');
      this.sendAction();
    
  
);

我想要实现的是通过以下方式冒泡事件:

Level3Component -&gt; Level2Component -&gt; Level1Component -&gt; ApplicationController

不幸的是,我无法处理任何组件内的事件;事件冒泡到ApplicationController

有没有办法强制组件的操作在整个组件层次结构中冒泡,以便我显示 4 次警报(当然是在添加 this.sendAction 之后)?

再一次,您可以使用以下代码:http://emberjs.jsbin.com/hasehija/2/edit。

【问题讨论】:

【参考方案1】:

根据您的示例,您必须将组件 targetObject 属性定义为:

App.Level3Component = Ember.Component.extend(
  action: 'handleAction',
  targetObject: Em.computed.alias('parentView'),  
  actions: 
    handleAction: function() 
      alert('Handled in Level 3');
      this.sendAction();
    
  
);

http://emberjs.jsbin.com/hasehija/5/edit

【讨论】:

谢谢!它完全回答了我的问题!我想知道最内部按钮的东西是否真的是一个错误。 嗯,这可能不是错误...“单击我(在组件内部)”按钮调用Level3Component,而不是Level2Component,所以恰好在它被定义的地方。我认为这是一种适当的行为。 我说的是“点击我(已生成)”,它应该针对组件而不是 ApplicationController 我错了,这是默认行为。有一个测试描述了这种情况“在产量内,目标指向原始目标”github.com/emberjs/ember.js/blob/master/packages/ember-routing/…【参考方案2】:

如果我正确理解了这个问题,this question is related 并且答案显示了您如何从模板中做到这一点——您也许可以做到:

#level-1
    #level-2 targetObject=view
      #level-3 targetObject=view
        <button action 'handleAction'>
          Click me (yielded)
        </button>
      /level-3
    /level-2
 /level-1

如果您不控制内部组件或不想像其他答案那样直接修改它们,这会很方便。

我认为您在这里说view 而不是上面答案中的parentView 的原因是Handlebars 将view 视为特殊关键字...无论如何,在模板中使用parentView 没有'不起作用(这让我很困惑,但无论如何)。

【讨论】:

以上是关于Ember:嵌套组件事件冒泡的主要内容,如果未能解决你的问题,请参考以下文章

反应点击事件冒泡“横向”,而不仅仅是“向上”

小程序 组件通信

better-scroll中嵌套原生滚动组件,原生滚动组件失效问题

微信小程序bindtap点击事件与事件冒泡

事件冒泡和阻止事件冒泡

小程序 鼠标事件