2015-06-23 10 views
6

में निर्देशक टेम्पलेट लोड करने में 404 त्रुटियों का प्रबंधन कैसे करें AngularJS निर्देश templateUrl पैरामीटर को डायनामिक रूप से परिभाषित किया गया है।AngularJS

'templates/' + content_id + '.html' 

मैं अगर content_id मूल्य मान्य है की जाँच करें और 404 त्रुटियों, अर्थात् के रूप में यह प्रबंधन करने के लिए करता है, तो टेम्पलेट मौजूद नहीं है नियमों को स्थापित करने के लिए नहीं करना चाहती लोड template/404.html (सर्वर ने 404 त्रुटि जब टेम्पलेट लोड हो रहा है वापसी) बजाय।

मैं यह कैसे कर सकता हूं?

संपादित: वर्तमान उत्तर प्रतिक्रिया त्रुटि इंटरसेप्टर का उपयोग करने का सुझाव देते हैं। इस मामले में ¿मैं कैसे जान सकता हूं कि प्रतिक्रिया इस टेम्पलेट की लोडिंग के लिए है?

+0

मैं इस बेहतर सर्वर साइड पर हैंडल किया जाएगा संदेह है। – Brandon

+0

शायद, लेकिन मैं जानना चाहता हूं कि यह कैसे करें। – francadaval

उत्तर

6

आपको प्रतिक्रिया त्रुटि इंटरसेप्टर लिखने की आवश्यकता होगी। कुछ इस तरह:

app.factory('template404Interceptor', function($injector) { 
    return { 
     responseError: function(response) { 
      if (response.status === 404 && /\.html$/.test(response.config.url)) { 
       response.config.url = '404.html'; 
       return $injector.get('$http')(response.config); 
      } 
      return $q.reject(response); 
     } 
    }; 
}); 

app.config(function($httpProvider) { 
    $httpProvider.interceptors.push('template404Interceptor'); 
}); 

डेमो:http://plnkr.co/edit/uCpnT5n0PkWO53PVQmvR?p=preview

+0

@ एनएलएन के उत्तर के बाद आधे घंटे का एक ही जवाब क्यों जोड़ें? –

+0

@NexusDuck जब मैंने अपना जवाब जोड़ा तो एनएलएन का ऐसा नहीं था जैसा कि यह अब देख रहा है, यह ओपी से पूछे जाने से पूरी तरह से अलग समस्या को हल कर रहा था। लेकिन अब यह वही अधिकार है, मूल रूप से क्योंकि यह मेरे उत्तर और मेरा डेमो के आधार पर अपडेट किया गया था :) बस संशोधन इतिहास की जांच करें। – dfsq

+0

आप सही हैं, मेरे खराब –

4

$http सेवा के साथ किए गए सभी अनुरोधों की निगरानी के लिए आप interceptor बना सकते हैं और किसी भी प्रतिक्रिया त्रुटियों को रोक सकते हैं। अगर आपको किसी भी अनुरोध के लिए स्थिति 404 मिलती है, तो बस उपयोगकर्ता को त्रुटि पृष्ठ पर रीडायरेक्ट करें (template/404.html अपने मामले में)।

.factory('httpRequestInterceptor', function ($q) { 
    return { 
     'responseError': function(rejection) { 
      if(rejection.status === 404){ 
       // do something on error     
      } 

      } 
      return $q.reject(rejection); 
     } 
    }; 
}); 

आप अपने config समारोह में $httpProvider को इंटरसेप्टर पुश करने के लिए की आवश्यकता होगी।

myApp.config(function ($httpProvider, $interpolateProvider, $routeProvider) { 
    $httpProvider.interceptors.push('httpRequestInterceptor'); 
}); 

यहाँ demo

चीयर्स है!

+1

यह xhr ¿में किसी भी 404 त्रुटि को रोक देगा, है ना? इसलिए यदि मैं अन्य निर्देश बनाता हूं, या उपयोग करता हूं, यदि उस टेम्पलेट में मौजूद नहीं है तो यह 'टेम्पलेट्स/404.html'' कॉल करेगा। – francadaval

+0

@ फ्रांसीसीडल: हाँ, यह सभी एक्सएचआर अनुरोधों में सभी प्रतिक्रिया स्थिति को रोक देगा – nalinc