恩伯:根据反应防止过渡

时间:2015-06-30 07:58:45

标签: javascript ember.js

在Ember.js中,你如何根据回应有条件地阻止过渡?

例如,如果服务器返回403(在模型挂钩中),则显示警报并且不转换。

这是一件非常简单和常见的事情,但我找不到任何文档或指南。

这是我到目前为止所拥有的

Ember.Route = Ember.Route.extend(InfinityRoute, {
  actions: {
    error: function(error){
      if (error.status === 403) {
        this.store.createRecord('notice', {
          message: "You are not authorized to view this content. Sorry man."
        });
      }
  }

通知有效,但我想中止过渡。它可能必须移动到另一个地方,因为在运行此错误挂钩时,转换已经发生了

1 个答案:

答案 0 :(得分:1)

实际上,从model挂钩(或afterModelbeforeModel返回被拒绝的承诺本身会导致过渡失败(不继续)。所以你不要需要做任何特别的事情来中止过渡。如果你想建立一个对话框或其他东西,那么:

model: function() {
    var model = this.store.find('my-model');
    model . catch(displayErrorMessage);
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    return model;
}

如果由于某种原因您更愿意明确中止转换,请使用第二个参数:

model: function(params, transition) {
                        ^^^^^^^^^^
    return this.store.find('my-model') .
        catch(() => { displayErrorMessage(); transition.abort() });
                                             ^^^^^^^^^^^^^^^^^^
}

http://guides.emberjs.com/v1.10.0/routing/preventing-and-retrying-transitions/上的指南页面"预防和重复转换"中描述了在model挂钩中中止转换:

  

modelbeforeModelafterModel 中排除转换   异步路由中描述的modelbeforeModelafterModel挂钩均使用转换对象进行调用。这使得目标路由可以中止尝试的转换。

如果您想抓住所有失败的ajax请求并执行某些操作,那么您可以使用ajaxComplete调用。这不是Ember本身,它是jQuery。在那里张贴你的对话框或消息。转换本身将由ajax错误自动中止,导致this.store.find的承诺进入拒绝状态。或者自己中止。

请注意,如果您使用的是加载子状态,则无法中止转换并保持原状。已经太晚了。

  

EAGER VS.懒惰的ASYNC过渡
  ...一旦你提供了一个目的地路线加载子状态,你就选择了一个渴望"渴望"过渡,也就是说,不像"懒惰"默认情况下,您将急切退出源路由(并拆除其模板等),以便转换到此子状态。