我遇到了异步发生的路由级别操作的问题,偶尔也无法处理。
在我的Ember应用程序中,我有时会收到错误:
Nothing handled the action 'X'. If you did handle the action, this error
can be caused by returning true from an action handler in a controller,
causing the action to bubble.
其中X
是某个操作的名称。问题不在于动作是冒泡还是未定义处理程序,因为它几乎一直在工作。
相反,问题涉及在承诺回调中调用this.send('X')
的事实,例如,在保存模型之后:
model.save().then(() => {
this.send('X');
});
如果保存在我的服务器上遇到网络拥塞或延迟,那么用户可能会在解决承诺时导航到另一条路由。并且该路线可能没有定义动作X
(或者更糟糕的是它可能是同名的错误动作)。
在这里使用动作是一个基本的设计缺陷吗?
如果是这样,这似乎会严重限制操作的效用,因为它们不能在任何异步上下文中使用。
或者是否有某种方式可以延迟路由转换,直到解决任何挂起的异步内容? (虽然这可能会造成它自己的不良症状)
答案 0 :(得分:2)
恕我直言,您所描述的案例中没有设计缺陷。这是承诺的本质。组件内部也可能发生同样的事情,并且可能会出现与尝试在已销毁的Ember组件上设置属性相关的一些错误。我用它来处理这种情况:Ember Concurrency
如果你看一下这个插件;你会看到有类似的案例被解释,这与你所描述的非常相似。我建议从像这样一个流行的,已经大量使用的库中受益,而不是试图通过你自己来解决它。我最诚挚的问候。
答案 1 :(得分:0)
为了简化编码,我建议在需要的地方将此类操作移至Application Controller
和inject
。
Application Controller可以注入
import Ember from 'ember';
export default Ember.Controller.extend({
appController: Ember.inject.controller('application')
});
在模板中使用它:
<button {{action 'X' target=appController}}> Login </button>
从您的代码中调用它
this.get('appController').send('X');
您也可以使用Service to achieve this。
答案 2 :(得分:0)
您可以在致电send
之前使用isDestroyed警卫检查。但我建议您在此用例中使用ember-concurrency addon。如果你可以通过How to do you check for isDestroyed
?讨论论坛,你会明白这一点。