【问题标题】:Cannot get Ember action to bubble无法让 Ember 动作冒泡
【发布时间】:2015-09-20 14:24:57
【问题描述】:

我花了很多时间尝试在 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());
    }
  }

但事实并非如此。我浪费了很多时间试图找出原因。

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

【问题讨论】:

  • 你能在 ember-twiddle.com 或 emberjs.jsbin.com 上设置演示吗?你在哪个模板中使用{{menu-bar authenticate="authenticate"}}
  • 嗨,我会尝试在 JSBin 中设置一些东西,尽管我以前从未这样做过。菜单栏在 application.hbs 模板中呈现,但组件在 login.hbs 模板中呈现(在 application.hbs 的出口中呈现)
  • 这将有助于解决这个问题。

标签: ember.js


【解决方案1】:

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

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

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

冒泡顺序如下:

  1. 组件
  2. 图书控制器
  3. 预订路线
  4. 图书路线
  5. 申请途径

TL;DR:在应用程序路由中捕获您的操作,而不是控制器。如果我能找到关于动作冒泡的指南,我将编辑我的答案并链接到它。

【讨论】:

  • 其实路线是我第一个尝试抓到的地方。我使用“ember 生成路由应用程序”来创建路由,然后在上面的控制器中添加了逻辑,但它仍然没有将“authenticated”记录到控制台或在 Ember 检查器中更新“isLoggedIn”。我认为关于 ActionBubbling 的部分可以在 guides.emberjs.com/v1.10.0/templates/actions/… 中找到,但它不会出现在以后的指南中。
  • Daniel Kmak 有一个答案被他删除,该答案建议对 sendAction() 方法指定一个操作。您可以尝试将this.sendAction("authenticate") 与我建议的解决方案结合使用吗?我相信如果你没有在调用中指定动作,你必须在你的模板中使用action="authenticate"
  • 感谢您的建议,但这些更改也没有奏效。我可以检查一下 - 应用程序路由可以称为 application.js,前提是它位于 routes 文件夹中?
【解决方案2】:

错误是我将 action="authenticate" 放在了错误的组件上!向 GJK 和 Daniel Kmak 道歉,因为他们浪费了您的时间试图解决这个问题,但似乎我刚刚搞混了。

【讨论】:

  • 这就是我想要演示的原因。 :D 祝你好运。
  • 没问题。这样的事情发生在我们所有人身上。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 2014-08-26
  • 2013-11-15
  • 2014-07-26
  • 2014-10-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多