2015-04-05 28 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({ 

});