2014-04-10 12 views
5

कोणीय, और ui रूटर

पर अपेक्षाओं और एक अलग राज्य के लिए पुनः निर्देशित करता है, तो एक पूर्व शर्त को पूरा नहीं कर रहा है के साथ संघर्ष कर:

मैं उपयोग करने की कोशिश एक इंटरसेप्टर: (How do I preform a redirect in an angular interceptor)।

लेकिन किसी ने उल्लेख किया कि $ stateChangeState को संभालना अधिक उपयुक्त होगा। लेकिन मैं अभी भी एक अनंत लूप में चला रहा हूँ:

/** 
    * Check here for preconditions of state transitions 
    */ 
    $rootScope.$on('$stateChangeStart', function(event, toState) { 

     // which states in accounts to be selected 
     var accountRequiredStates = ['user.list', 'user.new']; 
     if(_.contains(accountRequiredStates, toState.name)){ 
      event.preventDefault(); 
      ApiAccount.customGET('get_current').then(function(resp){ 
       // if I have a selected account, go about your business 
       if(resp.hasOwnProperty('id')){ 
        $state.go(toState.name); 
       } else { // prompt user to select account 
        $state.go('user.select_account'); 
       } 
      }) 
     } 
    }); 

किसी को भी एक बेहतर पैटर्न (एक है कि काम करता है)

धन्यवाद सुझाव दे सकते हैं!


नोट: इसी समस्या अलग यहाँ दृष्टिकोण: How do I preform a redirect in an angular interceptor

+0

यदि आप रीडायरेक्ट करना चाहते हैं तो आपको केवल ईवेंट को रोकना चाहिए। मुझे लगता है कि '$ state.go' को' $ टाइमआउट 'फ़ंक्शन में लपेटा जाना है। – zeroflagL

+0

धन्यवाद - क्या आप एक कोड स्निपिट साझा कर सकते हैं? – Jonathan

+0

मुझे लगता है कि आपका प्रश्न http://stackoverflow.com/questions/21631896/why-does-this-angular-ui-router-code-cause-an-infinite-loop-in-digest – linkary

उत्तर

1

मैं वहाँ कुछ भी सामान्य तरीके से आप ऐसा करने की कोशिश कर रहे साथ कुछ गड़बड़ है, हालांकि मैं एक विशेषज्ञ नहीं हूँ नहीं लगता। मुझे कार्यान्वयन में एक दोष दिखाई देता है जो ऐसा लगता है कि यह अनंत लूप का कारण बन सकता है। मान लें कि उपयोगकर्ता 'user.new' स्थिति पर जाने का प्रयास करता है। आपका $ stateChangeStart श्रोता यह स्वीकार करता है कि, इसे रद्द करता है, आपका कस्टम जीईटी करता है; तो यदि आंतरिक यदि स्थिति सत्य है (resp.hasOwnProperty('id')), तो आप उपयोगकर्ता को उसी 'user.new' स्थिति में भेजने का प्रयास करते हैं। उस बिंदु पर, आपका $ stateChangeStart श्रोता इसे अवरुद्ध करता है, इसे रद्द करता है, आदि, बार-बार।

तरह से मैं अपने कोड में इस समस्या से बचने एक चर मुझे बाईपास जाँच करें कि मदद करने के लिए (सेवा है जहाँ मैं श्रोता की घोषणा में) है: var middleOfRedirecting = false; अपने भीतर के अंदर अगर resp.hasOwnProperty('id') जांच के भीतर ब्लॉक, सेट middleOfRedirecting को सच; अपने $ stateChangeStart श्रोता की शुरुआत में केवल event.preventDefault() पर कॉल करने के लिए एक शर्त जोड़ें और यदि मध्यम OfRedirecting गलत है तो पुनर्निर्देशित करें। आपको middleOfRedirecting को झूठी पर सेट करने के लिए $ StateChangeSuccess श्रोता की भी आवश्यकता होगी, इसे अगले राज्य परिवर्तन के लिए रीसेट कर दिया जाएगा। (मुझे लगता है कि इससे बेहतर तरीका होना चाहिए, लेकिन कम से कम काम करता है।)

संबंधित मुद्दे