2015-04-05 9 views
6

W adapterze aplikacji zwracam kody błędów na podstawie błędów ajax. Zajmuję się nimi w metodzie błędu trasy aplikacji. Działa to świetnie, gdy uzyskuję dostęp do trasy poprzez link do. Ale jeśli odświeżam trasę lub wpisuję adres URL, program obsługi błędu mojej aplikacji nie jest wywoływany. Czy jest miejsce, w którym mogę umieścić tę obsługę błędów, która będzie gwarantowana za każdym razem? Naprawdę nie chcę zaimplementować tego samego kodu "jeśli 401, pokaż logowanie" na każdej trasie.Gdzie mogę umieścić obsługę błędów globalnego ajax w Ember?

szlaki/application.js:

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

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

Powyższy kod prawie pracował dla mnie. Głównym problemem, który uderzyłem, było to, że this.send ("showLogin") nie został przechwycony podczas odświeżania lub klikania adresu URL. Zmiana ta w transitionTo działa świetnie:

import Ember from 'ember'; 

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

Mam również ten problem i nie mogę znaleźć rozwiązania globalnego. Czy kiedykolwiek go rozwiązałeś? Wysłałem podobne pytanie: http://stackoverflow.com/questions/29926638/ember-handling-401s-revisited-in-2015 – Confused

+0

Tak, w końcu udało mi się. Zobacz powyższą edycję. – Dennis

Odpowiedz

0

Jeśli używasz RSVP obietnice, a potem

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

Lub jeśli używasz zwykłego jQuery XHR

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

To na pewno działa, ale miałem nadzieję, że poradzę sobie z tym na całym świecie. Mogę złapać je wszystkie w adapterze i zwrócić błąd, ale trasa aplikacji nie zawsze łapie ją tak, jak się spodziewam. – Dennis

1

Można zrobić adapter aplikacji, a następnie rozszerzyć każdy adapter od tego i użyć funkcji 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({ 

}); 
Powiązane problemy