2015-04-05 7 views
6

Nell'adattatore della mia applicazione, restituisco i codici di errore in base agli errori ajax. Sto gestendo questi nel metodo di errore del percorso dell'applicazione. Funziona alla grande se accedo a un percorso tramite link-to. Ma se aggiorno una rotta o semplicemente inserisco l'URL, il gestore degli errori dell'applicazione non viene chiamato. C'è un posto dove posso mettere questa gestione degli errori che sarà garantita per funzionare ogni volta? In realtà non voglio implementare lo stesso codice "se 401, mostra login" in ogni singola rotta.Dove posso inserire la gestione globale degli errori Ajax in Ember?

rotte/application.js:

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

adattatori/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:

Il codice sopra quasi ha funzionato per me. Il problema principale che ho riscontrato era this.send ('showLogin') che non veniva catturato durante l'aggiornamento o il raggiungimento dell'URL. La modifica di questa ad un transitionTo funziona alla grande:

import Ember from 'ember'; 

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

Ho anche questo problema e non ho potuto trovare una soluzione globale. L'hai mai risolto? Ho postato una domanda simile: http://stackoverflow.com/questions/29926638/ember-handling-401s-revisited-in-2015 – Confused

+0

Sì, finalmente ho funzionato. Vedi la modifica sopra. – Dennis

risposta

0

Se stai usando RSVP promesse, poi

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

Oppure, se si sta utilizzando jQuery pianura XHR

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

Funziona sicuramente, ma speravo di gestirlo globalmente. Posso catturarli tutti nell'adattatore e restituire un errore, ma il percorso dell'applicazione non sempre lo cattura come mi aspetto. – Dennis

1

Si può fare un adattatore per applicazione, quindi estendere ogni adattatore da questo e utilizzare la funzione 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({ 

});