2012-08-14 24 views
44

AngularJS ve JSON formundaki tüm istekleri ileten sunucu tarafı arka ucu kullanılarak oluşturulan bir uygulamam var. Her bir istek, talebe özgü verileri içeren bir veri değişkeni içeren bir JSON konteynerine sarılır. Uygulamada durumu ve kontrolü korumak, hataları ve başarı mesajlarını kontrol etmek ve oturum bayraklarını kontrol etmek için kullanılan diğer veriler. Diğer tüm değişkenler, HER istekle sunulur ve veri değişkeni önce incelenir.

Şu an için, önce JSON yanıtının içeriğini ve ardından da verilerin kendisini incelemek için bir yöntemim var.

$http.get('something.json').success(function(response) { 
    var data = examineJSONResponse(response); 
    //do the data stuff 
}); 

Bu çalışır ve examineJSONResponse kodlara göz alır ve yanlış bir şey varsa o zaman window.location.href kullanarak sayfayı bir istisna atar ve yeniden yükler.

Bunu AngularJS içinde otomatikleştirmenin herhangi bir yolu var mı? Böylece, her bir $ http araması yapıldığında, bunu denetler ve yalnızca veri değişkeni içeriklerini JSON yanıtı olarak döndürür?

cevap

85

Angular 1.1.4+ ile $httpProvider.interceptors arasına bir engelleyici ekleyerek yanıtları engelleyebilirsiniz (bkz. Dokümantasyon here aramayı araştırıcılar).

Json gibi belirli bir içerik türü için, arama başarılı olsa bile değişiklikleri reddedebilir veya bir istisna atarsınız. Siz de burada kontrolör koduna geçmiş olsun edeceğini response.data değiştirebilirsiniz:


NOT

myModule.factory('myHttpInterceptor', function ($q) { 
    return { 
     response: function (response) { 
      // do something on success 
      if(response.headers()['content-type'] === "application/json; charset=utf-8"){ 
       // Validate response, if not ok reject 
       var data = examineJSONResponse(response); // assumes this function is available 

       if(!data) 
        return $q.reject(response); 
      } 
      return response; 
     }, 
     responseError: function (response) { 
      // do something on error 
      return $q.reject(response); 
     } 
    }; 
}); 
myModule.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('myHttpInterceptor'); 
}); 
: Burada
önce 1.1.4'e sürümleri için özgün cevaptır ( responseInterceptors 1.1 Eğik ile kaldırılan edildi 0,4):

Belki daha iyi bir yol var ama potansiyel olarak değişiklik veya th reddetmek json gibi belirli bir içerik türü) için http tepki interceptor ile this post (here açıklanmıştır) (benzer bir şey yapabiliriz çağrı bir başarı olsa bile bir istisna satır. Denetleyici kodunuza iletilecek olan response.data'u burada da değiştirebilirsiniz.

myModule.factory('myHttpInterceptor', function ($q) { 
    return function (promise) { 
     return promise.then(function (response) { 
      // do something on success 
      if(response.headers()['content-type'] === "application/json; charset=utf-8"){ 
       // Validate response if not ok reject 
       var data = examineJSONResponse(response); // assumes this function is available 

       if(!data) 
        return $q.reject(response); 
      } 
      return response; 
     }, function (response) { 
      // do something on error 
      return $q.reject(response); 
     }); 
    }; 
}); 
myModule.config(function ($httpProvider) { 
    $httpProvider.responseInterceptors.push('myHttpInterceptor'); 
}); 
+0

Works: Şimdi bu

angular.module('App', []) .factory('myHttp',['$http',function($http) { return function(url, success, failure) { $http.get(url).success(function(json) { var data = examineJSONResponse(json); data && data.success ? success() : failure(); }).error(failure); ); } }]); 

Ve

gibi çağrılabilir. – matsko

+0

Bu durdurucuyu aslında nasıl açısal olarak kaydederim? –

+1

@MikeyCee Örneği, önleyiciyi kaydetmeyi dahil etmek için değiştirdim. Bu yardımcı olur umarım! – Gloopy

7

Başka bir çözüm, bir hizmet oluşturmak ve $ http değişkeninin etrafında kullanmaktır. Büyü gibi

myHttp(url, onSuccess, onFailure); 
+2

'hizmet' yönteminin ikinci parametre [listesiyle angularjs bu iplik] olarak açıklandığı gibi bir yapıcı işlevi, (https://groups.google.com/forum/# ​​olması gerekir, çünkü kod çalışmaz ! msg/açısal/56sdORWEoqg/b8hdPskxZXsJ). Sanırım muhtemelen "servis" yerine "fabrika" yazmanız gerekiyordu ve bu işe yarayacaktı. – tamakisquare

+0

Haklısınız. Bir fabrika olmalı. Şimdi güncellendi. Teşekkür ederim. – matsko

İlgili konular