2015-04-05 21 views
6

Uygulamamın bağdaştırıcısında, ajax hatalarına dayanarak hata kodlarını döndürüyorum. Bunları uygulama yolunun hata yönteminde ele alıyorum. Bu, link-to yoluyla bir rotaya erişirsek harika çalışır. Ancak bir rotayı yenilediğimde veya sadece URL’yi girerseniz, uygulamamın hata işleyicisi çağrılmıyor. Her seferinde çalışacağı garanti edilen bu hata işlemcisini koyabileceğim bir yer var mı? Her bir rotada aynısını "401 ise, kullanıcı girişi" kodunu uygulamak istemiyorum.Global ajax hatalarını Ember'e nereye koyabilirim?

yolları/application.js:

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

adaptörler/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; 
    } 
}); 

Düzenleme: Yukarıdaki kod neredeyse benim için çalıştı

. Vurduğum ana konu, URL’yi yenilerken veya isabetlerken bu programın ('showLogin') yakalanmamasıydı. Bir geçişinden bu Değişen harika işler:

import Ember from 'ember'; 

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

Bu soruna da sahibim ve küresel bir çözüm bulamadım. Hiç çözdün mü? Benzer bir soru yayınladım: http://stackoverflow.com/questions/29926638/ember-handling-401s-revisited-in-2015 – Confused

+0

Evet, sonunda çalıştım. Yukarıdaki düzenlemeye bakın. – Dennis

cevap

0

sonra,

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

RSVP vaat kullanıyorsanız Yoksa sen yapabilirsiniz düz jQuery xhr

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

Bu kesinlikle işe yarıyor, ancak küresel olarak ele almayı umuyordum. Hepsini adaptörde yakalayabilir ve bir hata verebilirim, ancak uygulama rotası her zaman beklediğim gibi yakalamıyor. – Dennis

1

kullanıyorsanız Bir uygulama bağdaştırıcısı ve sonra her bağdaştırıcıyı bundan uzatın ve isInvalid işlevini kullanın.

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

});