2014-10-01 8 views
7

पर काम नहीं करता है, मैं अपने कोणीय ऐप में रूटिंग के लिए ui.router का उपयोग कर रहा हूं। एक सामान्य लॉगिन परिदृश्य है, जहां मैं किसी उपयोगकर्ता को लॉग इन यूआरएल में रीडायरेक्ट कर रहा हूं, अगर वह लॉग इन नहीं है। Ui.router लाइब्रेरी के बिना, यह $R30Start ईवेंट $location.path के साथ संयुक्त किया गया। अब, मैं $stateChangeStart ईवेंट का उपयोग कर रहा हूं, $state.go के साथ संयुक्त, और कुछ भी काम नहीं करता है! यह मेरे ब्राउज़र को अनंत लूप में भी भेजता है। मैंने अन्य स्रोतों से पढ़ा है कि यह एक ज्ञात बग है, और सुझाए गए समाधानों में से कोई भी मेरे लिए काम नहीं करता है। इसके अलावा, $location.path भी लॉगिन पृष्ठ पर रीडायरेक्ट नहीं करता है।कोणीय यूई राउटर - रीडायरेक्शन सभी

यह कैसे मैं अपने पथ कॉन्फ़िगर कर दिया है है:

.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state('main', { 
      url: '/', 
      templateUrl: 'views/main.html', 
      controller: 'MainCtrl' 
     }) 
     .state('about', { 
      url: '/about', 
      templateUrl: 'views/about.html', 
      controller: 'AboutCtrl' 
     }) 
     .state('login', { 
      url: '/login', 
      templateUrl: 'views/loginform.html', 
      controller: 'LoginCtrl' 
     }); 
    $urlRouterProvider.otherwise("/"); 
}]) 

और मेरे run विधि:

.run(['$state', '$rootScope', '$location', function($state, $rootScope, $location) { 
    //Check when routing starts 
    //event, next, current 
    $rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) { 
     //Redirect to login if the user is not logged in 
     if (!isUserLoggedIn) { 

      //Some suggestion 
      //e.preventDefault(); 
      console.log('Not logged in'); 

      //Infinite loop, kills my browser! 
      $state.go('login'); 
      $state.transitionTo('login'); 

      //Some suggestion 
      $state.go('login', { url: '/login'}); 

      //Doesn't work 
      $location.path('/login'); 

      //$location.path($state.href('login'); 
      console.log('Redirected'); 
     } 
    }); 
+1

'isUserLoggedIn' कहां परिभाषित किया गया है? – Phil

+0

मेरे पास एक प्रमाणीकरण सेवा है, मैंने कुछ आधिकारिक कारणों से इसे इस कोड से छोड़ दिया है। यह डिफ़ॉल्ट रूटिंग के साथ अच्छी तरह से काम किया। –

उत्तर

8

क्या हम यहाँ की आवश्यकता होगी, रीडायरेक्ट नहीं करते है, अगर राज्य है पहले से ही 'लॉगिन'।

बस एक मसौदा तैयार किया समायोजन

$rootScope.$on('$stateChangeStart', function(e, toState , toParams 
               , fromState, fromParams) { 

    var isLogin = toState.name === "login"; 

    if(isLogin){ 

     return; // no need to redirect anymore 
    } 
    ... 

और यह भी हो सकता है, हम event.preventDefault();

... 
// also prevent default on redirect 
$state.go('login'); 
event.preventDefault(); 
... 

साथ $state.go('login'); बुलाना चाहिए इस क्यू & की जांच करें एक How can I fix 'Maximum call stack size exceeded' AngularJS और a plunker समान समाधान

+0

लेकिन मेरा लॉग इन फ्लैग वास्तव में एक ऐसा फ़ंक्शन है जो बुलियन लौटाता है और यह कुछ सेवा का हिस्सा है। मैं इस स्थिति में इसका उपयोग कैसे करूं? इसके अलावा, अनंत लूप हर जगह दिखाई नहीं देगा? –

+0

क्या आप यह उत्तर देख सकते हैं: http://stackoverflow.com/a/24725180/1679310? और इस plunker http://plnkr.co/edit/JLABnz?p=preview आज़माएं? यह दिखाना चाहिए कि यह कैसे काम कर सकता है। कुछ बाहरी सेवा 'उपयोगकर्ता' लौटने वाले बुलियन भी हैं, लेकिन अगर रीडायरेक्ट/रीडायरेक्ट करने के लिए तर्क अभी भी $ stateChangeStart में evaluted है। क्या यह मदद करता है? –

+0

बढ़िया! 'preventDefault' ईवेंट हैंडलर में काम करता है, और अब लॉगिन पृष्ठ पर पुनर्निर्देशन ठीक काम करता है। लेकिन, मेरे लॉगआउट फ़ंक्शन में, मैं लॉगिन पेज पर रीडायरेक्ट करने के लिए $ state.go का उपयोग करता हूं, यह अभी भी एक लूप की ओर जाता है। लॉगआउट एक बटन द्वारा ट्रिगर किया जाता है इसलिए मैं preventDefault का उपयोग कर सकता हूं। –

1
साथ

मैंने इस तरह कुछ इस्तेमाल किया:

MyApp.run(['$rootScope', '$state', function ($rootScope, $state) { 
    // The event 
    $rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) { 
    // Is user already logged in? 
    var isUserLoggedIn = $rootScope.isUserLoggedIn(); 

    if (isUserLoggedIn) { 
     // don't let user visit login state, he's already logged in. 
     $state.go('home'); 
     // preventDefault as described in @radim's answer 
     e.preventDefault(); 
    } else if (toState.name === "login") { 
     // user is not logged in and is not going to login state right now, send him there first. 
     $state.go('login'); 
     // preventDefault as described in @radim's answer 
     e.preventDefault(); 
    } 
    }); 
}]); 
संबंधित मुद्दे