在用户转换到新路由后可能会触发的ember操作可以做些什么?

时间:2017-03-01 17:35:36

标签: ember.js

我遇到了异步发生的路由级别操作的问题,偶尔也无法处理。

在我的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(或者更糟糕的是它可能是同名的错误动作)。

在这里使用动作是一个基本的设计缺陷吗?

如果是这样,这似乎会严重限制操作的效用,因为它们不能在任何异步上下文中使用。

或者是否有某种方式可以延迟路由转换,直到解决任何挂起的异步内容? (虽然这可能会造成它自己的不良症状)

3 个答案:

答案 0 :(得分:2)

恕我直言,您所描述的案例中没有设计缺陷。这是承诺的本质。组件内部也可能发生同样的事情,并且可能会出现与尝试在已销毁的Ember组件上设置属性相关的一些错误。我用它来处理这种情况:Ember Concurrency

如果你看一下这个插件;你会看到有类似的案例被解释,这与你所描述的非常相似。我建议从像这样一个流行的,已经大量使用的库中受益,而不是试图通过你自己来解决它。我最诚挚的问候。

答案 1 :(得分:0)

为了简化编码,我建议在需要的地方将此类操作移至Application Controllerinject

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?讨论论坛,你会明白这一点。