【问题标题】:Ember: nested components events bubblingEmber:嵌套组件事件冒泡
【发布时间】: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

【问题讨论】:

    标签: javascript events ember.js components event-bubbling


    【解决方案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 没有'不起作用(这让我很困惑,但无论如何)。

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 2013-11-15
      • 2015-12-10
      • 1970-01-01
      • 2012-12-18
      • 2018-08-24
      • 2016-12-01
      相关资源
      最近更新 更多