我花了很多时间尝试在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' });
});
冒泡顺序如下:
TL; DR:将您的操作吸引到应用程序路由中,而不是 Controller 中。如果可以找到有关冒泡的指南,则可以编辑答案并链接到它。
关于ember.js - 无法使Ember Action 冒泡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32680444/