我花了很多时间尝试在Ember中实现应该是一件简单的事情:将操作从组件冒泡到应用程序 Controller 。文档说,为了传播一个动作,那么我需要做的就是在声明模板时声明该动作:

{{#if isLoggedIn}}
  {{menu-bar action="authenticate"}}
{{/if}}

...然后从组件(嵌套在登录路径中)发送操作:
authenticate: function() {
  //code omitted for brevity
  this.sendAction('authenticate');
}

...应通过申请路线接收:
  user: Ember.inject.service(),
  isLoggedIn: false,
  actions: {
    authenticate: function(){
      console.log('authenticated!');
      this.set('isLoggedIn', this.get('user').isLoggedIn());
    }
  }

但事实并非如此。而且我在浪费大量时间试图找出原因。

我敢肯定这确实很明显,但是如果有人可以告诉我我在做什么错,我将不胜感激。

最佳答案

您的问题是应用程序 Controller 不应该捕获冒泡的操作,而应用程序路由却应该。为了我的一生,我再也无法在指南中找到相关的部分,但是动作不会在 Controller 中冒泡,它们会在路线中冒泡。动作通常最先发生(在您的情况下是对的)是相关的 Controller 。在您的情况下,您不希望 Controller 捕获它并使其冒泡。但是,如果某个动作未被 Controller 捕获,则它会冒泡到该 Controller 的路由。从那里,它不会冒泡到父 Controller ,而只会冒泡到父路由。

例如,假设您有以下路线:

this.route('books', function() {
    this.route('book', { path: '/:book_id' });
});

冒泡顺序如下:
  • 组件
  • 图书 Controller
  • 预订路线
  • 图书路线
  • 申请路线

  • TL; DR:将您的操作吸引到应用程序路由中,而不是 Controller 中。如果可以找到有关冒泡的指南,则可以编辑答案并链接到它。

    关于ember.js - 无法使Ember Action 冒泡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32680444/

    10-13 01:08