无法让Ember行动起泡

时间:2015-09-20 14:24:58

标签: ember.js

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

{{#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());
    }
  }

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

我确信这很明显,但如果有人能告诉我我做错了什么,我会非常感激。

1 个答案:

答案 0 :(得分:3)

您的问题是应用程序控制器不应该捕获冒泡的操作,应用程序 route 是。对于我的生活,我不能再在指南中找到相关部分,但是动作不会通过控制器冒泡,而是通过路径冒泡。通常行动的第一个地方(在你的情况下是真实的)是相关的控制器。在您的情况下,您不希望控制器捕获它,您希望它冒泡。但是,如果一个动作没有被控制器捕获,它就会冒泡到该控制器的路径。从那里,它不会冒泡到父控制器,它只会冒泡到父路径。

例如,让我们说你有以下路线:

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

冒泡的顺序如下:

  1. 组件
  2. 图书管理员
  3. 预订路线
  4. 图书路线
  5. 申请路线
  6. TL; DR:在应用程序路由中捕获您的操作,而不是控制器。如果我能找到关于动作冒泡的指南,我会编辑我的答案并链接到它。