javascript - Ember : Prevent transition based on response

标签 javascript ember.js

在 Ember.js 中,如何根据响应有条件地阻止转换?

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

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

这就是我目前所拥有的

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."
        });
      }
  }

该通知有效,但我想中止转换。它可能必须移动到另一个位置,因为当运行此错误 Hook 时,转换已经发生

最佳答案

实际上,从 model Hook (或 afterModelbeforeModel)返回被拒绝的 Promise 本身就会导致转换失败(无法继续) )。所以你不需要做任何特别的事情来中止转换。如果你想弹出一个对话框或其他东西,那么:

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() });
                                             ^^^^^^^^^^^^^^^^^^
}

model Hook 中的中止转换在指南页面“防止和重试转换”中进行了描述,网址为 http://guides.emberjs.com/v1.10.0/routing/preventing-and-retrying-transitions/ :

ABORTING TRANSITIONS WITHIN model, beforeModel, afterModel
The model, beforeModel, and afterModel hooks described in Asynchronous Routing each get called with a transition object. This makes it possible for destination routes to abort attempted transitions.

如果您想捕获所有失败的ajax请求并对其执行某些操作,则可以使用ajaxComplete调用。这本身不是 Ember,而是 jQuery。在那里放置您的对话框或消息。转换本身将因 ajax 错误而自动中止,导致 this.store.find 的 promise 进入拒绝状态。或者自己中止它。

请注意,如果您正在使用加载子状态,则不可能中止转换并保持原样。已经太晚了。

EAGER VS. LAZY ASYNC TRANSITIONS
...once you provide a destination route loading substate, you are opting into an "eager" transition, which is to say that, unlike the "lazy" default, you will eagerly exit the source routes (and tear down their templates, etc) in order to transition into this substate.

关于javascript - Ember : Prevent transition based on response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31132690/

相关文章:

ember.js - 如果连续更改两次,则观察到的计算属性不会触发

javascript - 如何在javascript中实现函数调用的任意链?

javascript - req.body.Dates 未定义

javascript - 重命名对象中的键

javascript - 与 contentscript 的 chrome 扩展中注入(inject)的 ember.js 发生冲突

ember.js - 如何将过滤的计算属性与 ember-drag-drop 可排序对象一起使用?

javascript - 使用 Ember.js 临时将 CSS 类添加到 DOM 元素

javascript - Ember - 从 Ember 数据数组中获取值

javascript - 如何使用 es6 从模块中导入所有内容?

javascript - 如何在触发 mouseup 时检测鼠标是否在移动?