想象一下这个结构的Ember.js应用程序(试过v1.13.9):
在索引模板上,只有一个带有操作的按钮:
<!-- index/template.js -->
<button {{action 'ping' 'index template'}}>index</button>
所有路由/控制器都会处理此操作,打印出一条消息并将操作传递到ApplicationRoute
。例如,对于IndexRoute
,它是:
// excerpt from index/route.js
actions: {
ping(from) {
console.log('IndexRoute^ping from', from);
return true;
}
}
同样的行动也可以来自IndexController
:
// excerpt from index/controller.js
thingsHappen() {
this.send('ping', 'index controller');
}
您可以在以下网址查看代码并进行播放:
当您按下按钮时,消息显示所有三个路线/控制器按顺序从内部冒泡看到该动作。但是,当从IndexController
发送操作时,它会跳过IndexRoute
。这是为什么?
答案 0 :(得分:3)
这与路线尚未真正过渡到这一事实有关。因此index
路由不是当前链的一部分。如果您想确保已加载index
路由,您可以联系转换承诺并等待它完成,然后再致电您的行动。
setupController(controller, model, transition) {
controller.wake('non attached');
transition.then(function(){
controller.wake('attached');
});
},