2015-04-05 7 views
6

Im Adapter meiner Anwendung gebe ich Fehlercodes basierend auf Ajax-Fehlern zurück. Ich behandle diese in der Fehlermethode der Anwendungsroute. Das funktioniert super, wenn ich über link-to auf eine Route zugreife. Wenn ich jedoch eine Route aktualisiere oder einfach die URL eingib, wird der Fehlerhandler meiner Anwendung nicht aufgerufen. Gibt es einen Ort, an den ich diese Fehlerbehandlung stellen kann, die garantiert jedes Mal ausgeführt wird? Ich möchte wirklich nicht den gleichen Code "if 401, show login" in jede einzelne Route implementieren.Wo kann ich die globale Ajax-Fehlerbehandlung in Ember einfügen?

Routen/application.js:

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

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

Edit:

Der obige Code fast für mich gearbeitet. Das Hauptproblem, das ich traf, war dies. Send ('showLogin') wurde beim Aktualisieren oder Treffen der URL nicht abgefangen. Dies zu ändern, zu einem transitionTo funktioniert super:

import Ember from 'ember'; 

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

Ich habe auch dieses Problem und konnte keine globale Lösung finden. Hast du es jemals gelöst? Ich habe eine ähnliche Frage gestellt: http://stackoverflow.com/questions/29926638/ember-handling-401s-revisited-in-2015 – Confused

+0

Ja, ich habe es endlich funktioniert. Siehe die obige Änderung. – Dennis

Antwort

0

Wenn Sie RSVP Versprechen verwenden, dann

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

Oder wenn Sie mit Klar jQuery xhr

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

Das funktioniert definitiv, aber ich hoffte, es global zu handhaben. Ich kann sie alle im Adapter abfangen und einen Fehler zurückgeben, aber die Anwendungsroute fängt nicht immer so ein, wie ich es erwarte. – Dennis

1

Sie können machen ein Anwendungsadapter, und erweitern Sie dann jeden Adapter und verwenden Sie die isInvalid-Funktion.

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

}); 
Verwandte Themen