我花了很多时间尝试在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());
}
}
但事实并非如此。而且我在浪费大量时间试图找出原因。
我确信这很明显,但如果有人能告诉我我做错了什么,我会非常感激。
答案 0 :(得分:3)
您的问题是应用程序控制器不应该捕获冒泡的操作,应用程序 route 是。对于我的生活,我不能再在指南中找到相关部分,但是动作不会通过控制器冒泡,而是通过路径冒泡。通常行动的第一个地方(在你的情况下是真实的)是相关的控制器。在您的情况下,您不希望控制器捕获它,您希望它冒泡。但是,如果一个动作没有被控制器捕获,它就会冒泡到该控制器的路径。从那里,它不会冒泡到父控制器,它只会冒泡到父路径。
例如,让我们说你有以下路线:
this.route('books', function() {
this.route('book', { path: '/:book_id' });
});
冒泡的顺序如下:
TL; DR:在应用程序路由中捕获您的操作,而不是控制器。如果我能找到关于动作冒泡的指南,我会编辑我的答案并链接到它。