2013-04-18 5 views

risposta

5

Ho lottato con lo stesso problema. Ho implementato con successo il seguente trucco.

window.App = Em.Application.extend 
    ready: -> 
    $(document).ajaxError((event, request, settings) => 
     if request.status == 401 && !["/profile", "https://stackoverflow.com/users/sign_in.json"].contains(settings.url) 
     controller = App.__container__.lookup('controller:application') 
     controller.transitionToRoute('sign_in') 
) 

L'idea è catturare un evento jQuery ajaxError. Nel caso in cui è possibile controllare il tipo di errore (.e.g. Request.status == 401), l'URL che ha causato l'errore (ad esempio settings.url) e in base a tali informazioni è possibile decidere cosa fare.

Spero che questo aiuti

+3

Questo dovrebbe essere gestita dal router ormai, simile a questo: http://stackoverflow.com/questions/17981563/ember -data-movimentazione-401S –

0

sto pensando un modo migliore è quello di utilizzare di Ember promesse:

@store.get("user").then(=> 
    # Success stuff here 
).fail(=> 
    @transitionTo("login") # Do other fancy error stuff here too 
) 

Il problema di questo è che avrebbe dovuto essere fatto su tutte le rotte individualmente. Forse potresti fare qualcosa con il metodo beforeTransition, controllando cosa restituisce la promessa? Solo spunti di riflessione.

8

Stavo facendo ricerche sullo stesso argomento e sembra che le informazioni qui siano un po 'obsolete. Usando Ember 1.7.0, dovresti gestire l'errore nel percorso. Se si desidera applicare questo per l'intera applicazione, si dovrebbe aggiungere alla vostra classe ApplicationRoute, in questo modo

// app/routes/application.js 
import Ember from 'ember'; 

var ApplicationRoute = Ember.Route.extend({ 
    actions: { 
     error: function (error, transition) { 
      // Handle the error here 
      if (error && error.status === 401) { 
       return this.transitionTo('login'); 
      } 
     } 
    } 
}); 

export default ApplicationRoute; 

Questo è lo stesso modo in cui la documentazione descrive: read here

Update: In versioni più recenti di Ember e Ember Data, la struttura dell'oggetto di errore sarà leggermente diversa. Lo stato sarà una stringa, contenuta all'interno di un oggetto errore, all'interno di una matrice errori:

actions: { 
    error: function(error, transition) { 
    if (error.errors[0].status === '401') { 
     this.transitionTo('sign-in'); 
    } 
    } 
}