2015-04-05 36 views
6

在我的应用程序的适配器中,我返回基于ajax错误的错误代码。我正在处理这些应用程序路由的错误方法。如果我通过链接访问路线,这非常有效。但是,如果我刷新路线或只输入URL,我的应用程序的错误处理程序不会被调用。有没有一个地方我可以把这个错误处理,将保证每次运行?我真的不想在每条路线上实施相同的“如果401,显示登录”代码。我在哪里可以把全局ajax错误处理在Ember中?

路线/ 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; 
    } 
}); 

编辑:

上面的代码对我来说几乎奏效。我碰到的主要问题是this.send('showLogin')在刷新或点击URL时未被捕获。此更改为transitionTo的伟大工程:

import Ember from 'ember'; 

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

我也有这个问题,找不到一个全球性的解决方案。你有没有解决它?我发布了一个类似的问题:http://stackoverflow.com/questions/29926638/ember-handling-401s-revisited-in-2015 – Confused 2015-04-30 19:39:28

+0

是的,我终于搞定了。看到上面的编辑。 – Dennis 2015-05-01 19:07:20

回答

0

如果您使用RSVP许诺,那么,

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

或者,如果你使用普通的jQuery XHR

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

这绝对有效,但我希望能在全球范围内处理它。我可以在适配器中捕获它们,并返回一个错误,但应用程序路径并不总是像我期望的那样捕获它。 – Dennis 2015-04-07 04:26:00

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({ 

});