我在哪里可以将全局ajax错误处理放在Ember中?

时间:2015-04-05 20:01:37

标签: ajax ember-data ember-cli

在我的应用程序的适配器中,我根据ajax错误返回错误代码。我在应用程序路径的错误方法中处理这些问题。如果我通过link-to访问路由,这非常有用。但是如果我刷新路线或只输入URL,我的应用程序的错误处理程序就不会被调用。有没有一个地方我可以把这个错误处理保证每次运行?我真的不想实现同样的#34;如果是401,请登录"每条路线都有代码。

路由/ application.js中:

export default Ember.Route.extend({
  actions: {
    error: function(reason) {
        if (reason === 401) {
          alert('401');
            this.send('showLogin');
        }
    },

适配器/ application.js中:

import DS from 'ember-data';

export default DS.ActiveModelAdapter.extend({
    'namespace': '',
  ajaxError: function(jqXHR) {
    var error = this._super(jqXHR);
    if (jqXHR && jqXHR.status === 401) {
        return 401;
    }
    return error;
  }
});

修改

以上代码几乎对我有用。我遇到的主要问题是在刷新或点击网址时没有抓住这个(' showLogin')。将此更改为转换可以很好地使用:

import Ember from 'ember';

export default Ember.Route.extend(ApplicationRouteMixin, {
  actions: {
    error: function(reason) {
      if (reason === 401) {
        this.transitionTo('login');
      }
    },
    ...

2 个答案:

答案 0 :(得分:1)

您可以创建一个应用程序适配器,然后从中扩展每个适配器,并使用isInvalid函数。

//app/adapters/application.js
import DS from 'ember-data';
import Ember from 'ember';

export default DS.JSONAPIAdapter.extend({

    isInvalid(status, headers, payload){ 
        if (status===401) {}
    },

});

//app/adapters/anotherAdapter.js

import AppAdapter from 'yourapp/adapters/application';

export default AppAdapter.extend({

});

答案 1 :(得分:0)

如果您正在使用RSVP承诺,那么

Ember.RSVP.on('error', function(error) {
    // ...
});

或者如果您使用普通的jQuery xhr

$(document).ajaxError(function(evt, jqXHR) {
    // ...
});