शर्त के आधार पर एक निश्चित मार्ग पर पुनर्निर्देशित करना


493

मैं एक छोटा सा AngularJS ऐप लिख रहा हूं जिसमें एक लॉगिन दृश्य और एक मुख्य दृश्य है, जैसे कॉन्फ़िगर किया गया है:

$routeProvider
 .when('/main' , {templateUrl: 'partials/main.html',  controller: MainController})
 .when('/login', {templateUrl: 'partials/login.html', controller: LoginController})
 .otherwise({redirectTo: '/login'});

मेरा LoginController उपयोगकर्ता / पास संयोजन की जाँच करता है और यह दर्शाते हुए $ rootScope पर एक संपत्ति सेट करता है:

function LoginController($scope, $location, $rootScope) {
 $scope.attemptLogin = function() {
   if ( $scope.username == $scope.password ) { // test
        $rootScope.loggedUser = $scope.username;
        $location.path( "/main" );
    } else {
        $scope.loginError = "Invalid user/pass.";
    }
}

सब कुछ काम करता है, लेकिन अगर मैं एक्सेस करता http://localhost/#/mainहूं तो मैं लॉगिन स्क्रीन को दरकिनार कर देता हूं। मैं कुछ लिखना चाहता था "जब भी मार्ग बदलता है, अगर $ rootScope.loggedUser अशक्त है / तो / पर पुनर्निर्देशित करें"

...

... रुको। क्या मैं किसी तरह से मार्ग परिवर्तन को सुन सकता हूं? मैं इस सवाल को वैसे भी पोस्ट करूंगा और देखता रहूंगा।


3
बस स्पष्ट करने के लिए: जबकि नीचे दिए गए कई समाधान अच्छी तरह से काम करते हैं, मैं हाल ही में @ ओरान के उत्तर को स्वीकार करने के लिए अधिक इच्छुक हूं - अर्थात, एक संवेदनशील URL के लिए पूछे जाने पर 401 कोड के साथ सर्वर का जवाब है, और उस जानकारी को नियंत्रित करने के लिए उपयोग करें। क्लाइंट पर "लॉगिन बॉक्स"। (हालांकि जूरी अभी भी "कतार से इनकार किए गए अनुरोधों पर और बाद में उन्हें फिर से जारी करने" पर कम से कम, मेरे लिए कम से कम :)) पर बाहर हैं
st.never

जवाबों:


510

कुछ प्रलेखन और स्रोत कोड के माध्यम से डाइविंग के बाद, मुझे लगता है कि मुझे यह काम कर रहा है। शायद यह किसी और के लिए उपयोगी होगा?

मैंने अपने मॉड्यूल कॉन्फ़िगरेशन में निम्नलिखित को जोड़ा:

angular.module(...)
 .config( ['$routeProvider', function($routeProvider) {...}] )
 .run( function($rootScope, $location) {

    // register listener to watch route changes
    $rootScope.$on( "$routeChangeStart", function(event, next, current) {
      if ( $rootScope.loggedUser == null ) {
        // no logged user, we should be going to #login
        if ( next.templateUrl != "partials/login.html" ) {
          // not going to #login, we should redirect now
          $location.path( "/login" );
        }
      }         
    });
 })

एक चीज जो अजीब लगती है वह यह है कि मुझे आंशिक नाम ( login.html) का परीक्षण करना था क्योंकि "अगले" रूट ऑब्जेक्ट में एक url या कुछ और नहीं था। शायद एक बेहतर तरीका है?


13
शांत आदमी, आपके समाधान को साझा करने के लिए धन्यवाद। नोट करने के लिए एक बात: वर्तमान संस्करण में, यह "अगला है। $ मार्ग ।emplateUrl"
doubleledriscoll

5
यदि आप क्रोम इंस्पेक्टर में नेटवर्क अनुरोधों को देखते हैं जो रूट को पुनर्निर्देशित किया जा रहा है (क्योंकि उपयोगकर्ता लॉग इन नहीं है) तब भी कॉल किया जाता है और एक प्रतिक्रिया ब्राउज़र को भेजी जाती है, और फिर रीडायरेक्ट किए गए पथ '/ लॉगिन' को कहा जाता है। इसलिए यह विधि अच्छी नहीं है क्योंकि गैर-लॉग-इन उपयोगकर्ता उस मार्ग के लिए प्रतिक्रिया देख सकते हैं जिसकी उन्हें पहुँच नहीं होनी चाहिए।
सोनिकबोम

34
मार्ग को बदलने से रोकने के लिए $ pathChangeStart के बजाय $ locationChangeStart का उपयोग करें और बिना उपयोग किए उपयोगकर्ताओं को ऐसी सामग्री देखने दें जिसकी उन्हें पहुंच नहीं होनी चाहिए।
सोनिकबोम

17
याद रखें कि यह ग्राहक है। एक सर्वरसाइड अवरोध भी होना चाहिए।
नीकोस

2
@sonicboom $ locationChangeStart को इससे कोई मतलब नहीं है कि सभी मार्गों को प्रमाणीकरण की आवश्यकता नहीं है, $ मार्गChangeStart के साथ आप रूट ऑब्जेक्ट पर मेटाडेटा रख सकते हैं, जैसे कि यह प्रमाणित है या नहीं कि उस रूट के लिए क्या भूमिकाओं की आवश्यकता है। आपके सर्वर को बिना अनुचित सामग्री दिखाए नहीं संभालना चाहिए और मार्ग बदलने के बाद AngularJS प्रसंस्करण शुरू नहीं करेगा, इसलिए कुछ भी नहीं दिखाया जाना चाहिए।
क्रिस निकोला

93

यहाँ शायद 'रिज़ॉल्यूशन' कॉन्फ़िगरेशन प्रॉपर्टी और 'वादों' के साथ एक और अधिक सुरुचिपूर्ण और लचीला समाधान है जो डेटा के आधार पर रूटिंग और रूटिंग नियमों पर अंतिम डेटा लोडिंग को सक्षम करता है।

आप रूटिंग कॉन्फिग में और फंक्शन लोड में 'रिज़ॉल्यूशन' में एक फंक्शन निर्दिष्ट करते हैं और डेटा की जाँच करते हैं, सभी रीडायरेक्ट करते हैं। यदि आपको डेटा लोड करने की आवश्यकता है, तो आप एक वादा वापस करते हैं, यदि आपको रीडायरेक्ट करने की आवश्यकता है - इससे पहले वादा अस्वीकार करें। सभी विवरण $ राऊटरप्रोवाइडर और $ क्यू प्रलेखन पृष्ठों पर पाए जा सकते हैं ।

'use strict';

var app = angular.module('app', [])
    .config(['$routeProvider', function($routeProvider) {
        $routeProvider
            .when('/', {
                templateUrl: "login.html",
                controller: LoginController
            })
            .when('/private', {
                templateUrl: "private.html",
                controller: PrivateController,
                resolve: {
                    factory: checkRouting
                }
            })
            .when('/private/anotherpage', {
                templateUrl:"another-private.html",
                controller: AnotherPriveController,
                resolve: {
                    factory: checkRouting
                }
            })
            .otherwise({ redirectTo: '/' });
    }]);

var checkRouting= function ($q, $rootScope, $location) {
    if ($rootScope.userProfile) {
        return true;
    } else {
        var deferred = $q.defer();
        $http.post("/loadUserProfile", { userToken: "blah" })
            .success(function (response) {
                $rootScope.userProfile = response.userProfile;
                deferred.resolve(true);
            })
            .error(function () {
                deferred.reject();
                $location.path("/");
             });
        return deferred.promise;
    }
};

रूसी बोलने वाले लोगों के लिए habr पर एक पोस्ट है " Вариант условного раутинга в AngularJS ।"


1
चेकआउट फंक्शन को कारखाने में मैप क्यों किया जाता है? क्या इससे कोई फर्क पड़ता है कि इसे क्या मैप किया जाता है?
ऑनस्ककिललेट

@honkskillet: कोणीय $ मार्गप्रोविडर डॉक्स से: "फ़ैक्ट्री - {string | function}: अगर स्ट्रिंग है तो यह एक सेवा के लिए एक उपनाम है। अन्यथा यदि फ़ंक्शन, तो इसे इंजेक्ट किया जाता है और रिटर्न मान को निर्भरता के रूप में माना जाता है। परिणाम एक वादा है, इसका मूल्य नियंत्रक में इंजेक्ट होने से पहले इसे हल किया जाता है। ध्यान रखें कि ngRoute। $ मार्गप्रेम अभी भी इन संकल्प कार्यों के भीतर पिछले मार्ग को संदर्भित करेगा। नए मार्ग मापदंडों का उपयोग करने के लिए $ मार्ग.current.params का उपयोग करें। बजाय।" डॉक्स से भी संकल्प पर: "यदि किसी भी वादे को अस्वीकार कर दिया जाता है तो $ मार्ग परिवर्तन घटना को निकाल दिया जाता है।"
टिम पेरी

यदि ui.routerउपयोग किया जाता है, तो $stateProvider इसके बजाय का उपयोग करें $routeProvider
TRNENE

61

मैं भी ऐसा ही करने की कोशिश कर रहा हूं। एक सहकर्मी के साथ काम करने के बाद एक और सरल समाधान के साथ आया। मेरे पास एक घड़ी है $location.path()। वह चालबाजी करता है। मैं केवल AngularJS सीखना शुरू कर रहा हूं और इसे अधिक क्लीनर और पठनीय पाया जा सकता है।

$scope.$watch(function() { return $location.path(); }, function(newValue, oldValue){  
    if ($scope.loggedIn == false && newValue != '/login'){  
            $location.path('/login');  
    }  
});

यह बहुत दिलचस्प लग रहा है। क्या आप कहीं एक उदाहरण पोस्ट करने में सक्षम थे?
kyleroche

3
आप घड़ी की स्थापना कहां करते हैं?
freakTheMighty

3
@freakTheMighty आपको अपने मेनक्राट फ़ंक्शन में घड़ी सेट करनी होगी, जहाँ एनजी-कंट्रोलर मेनक्लेयर पर सेट है। उदा <body ng-नियंत्रक = "mainCtrl">
user1807337

5
मुझे लगता है कि यह केवल उचित है कि यदि कोई नकारात्मक वोट दिया जाता है, तो इसका कारण के साथ एक टिप्पणी होनी चाहिए। यह एक शिक्षण उपकरण के रूप में मदद करेगा।
user1807337

37

लॉगिन पुनर्निर्देशन को लागू करने का एक अलग तरीका यहां वर्णित घटनाओं और इंटरसेप्टर का उपयोग करना है । आलेख कुछ अतिरिक्त लाभों का वर्णन करता है जैसे कि लॉगिन की आवश्यकता होने पर, अनुरोधों को कतारबद्ध करना, और लॉगिन सफल होने के बाद उन्हें फिर से खेलना।

आप यहां एक कार्यशील डेमो आज़मा सकते हैं और यहां डेमो स्रोत देख सकते हैं


3
क्या आप लिंक से संबंधित जानकारी को शामिल करने के लिए कृपया इस उत्तर को अपडेट कर सकते हैं? इस तरह यह आगंतुकों के लिए उपयोगी बना रहेगा भले ही लिंक नीचे जाए।
josliber

34

1. वैश्विक वर्तमान उपयोगकर्ता सेट करें।

अपनी प्रमाणीकरण सेवा में, वर्तमान में प्रमाणित उपयोगकर्ता को रूट स्कोप पर सेट करें।

// AuthService.js

  // auth successful
  $rootScope.user = user

2. प्रत्येक संरक्षित मार्ग पर सेट करें।

// AdminController.js

.config(function ($routeProvider) {
  $routeProvider.when('/admin', {
    controller: 'AdminController',
    auth: function (user) {
      return user && user.isAdmin
    }
  })
})

3. प्रत्येक रूट परिवर्तन पर जाँच करें।

// index.js

.run(function ($rootScope, $location) {
  $rootScope.$on('$routeChangeStart', function (ev, next, curr) {
    if (next.$$route) {
      var user = $rootScope.user
      var auth = next.$$route.auth
      if (auth && !auth(user)) { $location.path('/') }
    }
  })
})

वैकल्पिक रूप से आप उपयोगकर्ता ऑब्जेक्ट पर अनुमतियाँ सेट कर सकते हैं और प्रत्येक मार्ग को अनुमति दे सकते हैं, फिर ईवेंट कॉलबैक में अनुमति की जांच करें।


@malcolmhall yup, यह ऑप्ट-इन है और आप ऑप्ट-आउट चाहते हैं। इसके बजाय लॉगिन पृष्ठ जैसे सार्वजनिक मार्गों पर "सार्वजनिक" बूलियन जोड़ें, और पुनः निर्देशित करेंif (!user && !next.$$route.public)
AJcodez

क्या कोई next.$$routeमुझे समझा सकता है? मुझे एंगुलर डॉक्स में ऐसा कुछ नहीं मिला, जो किसी $routeChangeStartघटना के लिए दिए गए तर्कों का वर्णन करता हो , लेकिन मुझे लगता है nextऔर currकुछ प्रकार के स्थान हैं? $$routeबिट गूगल के लिए कठिन है।
स्केडल

2
मैं अब देखता हूं कि $$routeसंपत्ति कोणीय का एक निजी चर है। आपको उस पर भरोसा नहीं करना चाहिए, उदाहरण के लिए देखें: stackoverflow.com/a/19338518/1132101 - यदि आप करते हैं, तो कोणीय परिवर्तन होने पर आपका कोड टूट सकता है।
स्केडल

2
मैं के माध्यम से एक निजी संपत्ति तक पहुँचने या पाश के बिना मार्ग तक पहुंचने का तरीका मिल गया है $route.routesएक सूची बनाने के लिए (@ thataustin के जवाब के रूप में): के साथ स्थान के लिए पथ प्राप्त next.originalPathऔर उपयोग कि सूचकांक को $route.routes: var auth = $route.routes[next.originalPath]
स्केजडाल

जैसा कि घटना के लिए दिए गए तर्कों पर तीन टिप्पणियों से पहले मेरे प्रश्न का उत्तर देने के लिए - वे वास्तव में अनिर्दिष्ट प्रतीत होते हैं, इस मुद्दे को देखें जो इस SO प्रश्न को संदर्भित करने के लिए भी होता है: github.com/angular/angular.js/issues/ 10994
स्केडल

27

यहाँ बताया गया है कि मैंने यह कैसे किया, यदि यह किसी की मदद करता है:

कॉन्फ़िगरेशन में, मैं publicAccessउन कुछ मार्गों पर एक विशेषता सेट करता हूं, जिन्हें मैं जनता के लिए खोलना चाहता हूं (जैसे लॉगिन या रजिस्टर):

$routeProvider
    .when('/', {
        templateUrl: 'views/home.html',
        controller: 'HomeCtrl'
    })
    .when('/login', {
        templateUrl: 'views/login.html',
        controller: 'LoginCtrl',
        publicAccess: true
    })

तब एक रन ब्लॉक में, मैं उस श्रोता को इस $routeChangeStartघटना पर सेट करता हूं जो '/login'तब तक रीडायरेक्ट करता है जब तक कि उपयोगकर्ता की पहुंच या रूट सार्वजनिक रूप से एक्सेस न हो:

angular.module('myModule').run(function($rootScope, $location, user, $route) {

    var routesOpenToPublic = [];
    angular.forEach($route.routes, function(route, path) {
        // push route onto routesOpenToPublic if it has a truthy publicAccess value
        route.publicAccess && (routesOpenToPublic.push(path));
    });

    $rootScope.$on('$routeChangeStart', function(event, nextLoc, currentLoc) {
        var closedToPublic = (-1 === routesOpenToPublic.indexOf($location.path()));
        if(closedToPublic && !user.isLoggedIn()) {
            $location.path('/login');
        }
    });
})

आप स्पष्ट रूप से स्थिति isLoggedInको किसी और चीज़ से बदल सकते हैं ... बस इसे करने का दूसरा तरीका दिखा रहे हैं।


और आपके रन ब्लॉक तर्कों में उपयोगकर्ता क्या है? एक सेवा?
मुहम्मनाग

हां, यह एक ऐसी सेवा है जो उपयोगकर्ता को लॉग इन करने के लिए कुकीज आदि की जांच करने का ध्यान रखती है।
वह aaustin

आप nextLoc.$$route.publicAccessbtw की तरह मार्ग का उपयोग कर सकते हैं ।
एजेकोड जूल

या उपयोग करें $route.routes[nextLoc.originalPath], जो एक निजी चर का उपयोग नहीं करता है।
20 अगस्त को स्केडल

1
वास्तव में, आप बस के लिए जाँच कर सकते हैं nextLoc && nextLoc.publicAccess!
स्केजडाल

9

मैं इसे इंटरसेप्टर्स का उपयोग कर रहा हूं। मैंने एक लाइब्रेरी फ़ाइल बनाई है जिसे index.html फ़ाइल में जोड़ा जा सकता है। इस तरह आपके पास अपनी शेष सेवा कॉल के लिए वैश्विक त्रुटि से निपटने और व्यक्तिगत रूप से सभी त्रुटियों के बारे में परवाह करने की आवश्यकता नहीं है। इसके अलावा मैंने अपनी बुनियादी-सामान्य लॉगिन लाइब्रेरी को भी चिपकाया। वहां आप देख सकते हैं कि मैं 401 त्रुटि के लिए भी जांच करता हूं और एक अलग स्थान पर रीडायरेक्ट करता हूं। देखें लिब / ई-बेसिक-ऑरिजनल-लॉगिन.जेएस

lib / http-त्रुटि handling.js

/**
* @ngdoc overview
* @name http-error-handling
* @description
*
* Module that provides http error handling for apps.
*
* Usage:
* Hook the file in to your index.html: <script src="lib/http-error-handling.js"></script>
* Add <div class="messagesList" app-messages></div> to the index.html at the position you want to
* display the error messages.
*/
(function() {
'use strict';
angular.module('http-error-handling', [])
    .config(function($provide, $httpProvider, $compileProvider) {
        var elementsList = $();

        var showMessage = function(content, cl, time) {
            $('<div/>')
                .addClass(cl)
                .hide()
                .fadeIn('fast')
                .delay(time)
                .fadeOut('fast', function() { $(this).remove(); })
                .appendTo(elementsList)
                .text(content);
        };

        $httpProvider.responseInterceptors.push(function($timeout, $q) {
            return function(promise) {
                return promise.then(function(successResponse) {
                    if (successResponse.config.method.toUpperCase() != 'GET')
                        showMessage('Success', 'http-success-message', 5000);
                    return successResponse;

                }, function(errorResponse) {
                    switch (errorResponse.status) {
                        case 400:
                            showMessage(errorResponse.data.message, 'http-error-message', 6000);
                                }
                            }
                            break;
                        case 401:
                            showMessage('Wrong email or password', 'http-error-message', 6000);
                            break;
                        case 403:
                            showMessage('You don\'t have the right to do this', 'http-error-message', 6000);
                            break;
                        case 500:
                            showMessage('Server internal error: ' + errorResponse.data.message, 'http-error-message', 6000);
                            break;
                        default:
                            showMessage('Error ' + errorResponse.status + ': ' + errorResponse.data.message, 'http-error-message', 6000);
                    }
                    return $q.reject(errorResponse);
                });
            };
        });

        $compileProvider.directive('httpErrorMessages', function() {
            return {
                link: function(scope, element, attrs) {
                    elementsList.push($(element));
                }
            };
        });
    });
})();

सीएसएस / http-त्रुटि handling.css

.http-error-message {
    background-color: #fbbcb1;
    border: 1px #e92d0c solid;
    font-size: 12px;
    font-family: arial;
    padding: 10px;
    width: 702px;
    margin-bottom: 1px;
}

.http-error-validation-message {
    background-color: #fbbcb1;
    border: 1px #e92d0c solid;
    font-size: 12px;
    font-family: arial;
    padding: 10px;
    width: 702px;
    margin-bottom: 1px;
}

http-success-message {
    background-color: #adfa9e;
    border: 1px #25ae09 solid;
    font-size: 12px;
    font-family: arial;
    padding: 10px;
    width: 702px;
    margin-bottom: 1px;
}

index.html

<!doctype html>
<html lang="en" ng-app="cc">
    <head>
        <meta charset="utf-8">
        <title>yourapp</title>
        <link rel="stylesheet" href="css/http-error-handling.css"/>
    </head>
    <body>

<!-- Display top tab menu -->
<ul class="menu">
  <li><a href="#/user">Users</a></li>
  <li><a href="#/vendor">Vendors</a></li>
  <li><logout-link/></li>
</ul>

<!-- Display errors -->
<div class="http-error-messages" http-error-messages></div>

<!-- Display partial pages -->
<div ng-view></div>

<!-- Include all the js files. In production use min.js should be used -->
<script src="lib/angular114/angular.js"></script>
<script src="lib/angular114/angular-resource.js"></script>
<script src="lib/http-error-handling.js"></script>
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>

lib / ईए-बुनियादी लेखन-login.js

लॉगिन के लिए लगभग वही किया जा सकता है। यहां आपके पास रीडायरेक्ट ($ location.path ("/ login")) का जवाब है।

/**
* @ngdoc overview
* @name ea-basic-auth-login
* @description
*
* Module that provides http basic authentication for apps.
*
* Usage:
* Hook the file in to your index.html: <script src="lib/ea-basic-auth-login.js">  </script>
* Place <ea-login-form/> tag in to your html login page
* Place <ea-logout-link/> tag in to your html page where the user has to click to logout
*/
(function() {
'use strict';
angular.module('ea-basic-auth-login', ['ea-base64-login'])
    .config(['$httpProvider', function ($httpProvider) {
        var ea_basic_auth_login_interceptor = ['$location', '$q', function($location, $q) {
            function success(response) {
                return response;
            }

            function error(response) {
                if(response.status === 401) {
                    $location.path('/login');
                    return $q.reject(response);
                }
                else {
                    return $q.reject(response);
                }
            }

            return function(promise) {
                return promise.then(success, error);
            }
        }];
        $httpProvider.responseInterceptors.push(ea_basic_auth_login_interceptor);
    }])
    .controller('EALoginCtrl', ['$scope','$http','$location','EABase64Login', function($scope, $http, $location, EABase64Login) {
        $scope.login = function() {
            $http.defaults.headers.common['Authorization'] = 'Basic ' + EABase64Login.encode($scope.email + ':' + $scope.password);
            $location.path("/user");
        };

        $scope.logout = function() {
            $http.defaults.headers.common['Authorization'] = undefined;
            $location.path("/login");
        };
    }])
    .directive('eaLoginForm', [function() {
        return {
            restrict:   'E',
            template:   '<div id="ea_login_container" ng-controller="EALoginCtrl">' +
                        '<form id="ea_login_form" name="ea_login_form" novalidate>' +
                        '<input id="ea_login_email_field" class="ea_login_field" type="text" name="email" ng-model="email" placeholder="E-Mail"/>' +
                        '<br/>' +
                        '<input id="ea_login_password_field" class="ea_login_field" type="password" name="password" ng-model="password" placeholder="Password"/>' +
                        '<br/>' +
                        '<button class="ea_login_button" ng-click="login()">Login</button>' +
                        '</form>' +
                        '</div>',
            replace: true
        };
    }])
    .directive('eaLogoutLink', [function() {
        return {
            restrict: 'E',
            template: '<a id="ea-logout-link" ng-controller="EALoginCtrl" ng-click="logout()">Logout</a>',
            replace: true
        }
    }]);

angular.module('ea-base64-login', []).
    factory('EABase64Login', function() {
        var keyStr = 'ABCDEFGHIJKLMNOP' +
            'QRSTUVWXYZabcdef' +
            'ghijklmnopqrstuv' +
            'wxyz0123456789+/' +
            '=';

        return {
            encode: function (input) {
                var output = "";
                var chr1, chr2, chr3 = "";
                var enc1, enc2, enc3, enc4 = "";
                var i = 0;

                do {
                    chr1 = input.charCodeAt(i++);
                    chr2 = input.charCodeAt(i++);
                    chr3 = input.charCodeAt(i++);

                    enc1 = chr1 >> 2;
                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                    enc4 = chr3 & 63;

                    if (isNaN(chr2)) {
                        enc3 = enc4 = 64;
                    } else if (isNaN(chr3)) {
                        enc4 = 64;
                    }

                    output = output +
                        keyStr.charAt(enc1) +
                        keyStr.charAt(enc2) +
                        keyStr.charAt(enc3) +
                        keyStr.charAt(enc4);
                    chr1 = chr2 = chr3 = "";
                    enc1 = enc2 = enc3 = enc4 = "";
                } while (i < input.length);

                return output;
            },

            decode: function (input) {
                var output = "";
                var chr1, chr2, chr3 = "";
                var enc1, enc2, enc3, enc4 = "";
                var i = 0;

                // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
                var base64test = /[^A-Za-z0-9\+\/\=]/g;
                if (base64test.exec(input)) {
                    alert("There were invalid base64 characters in the input text.\n" +
                        "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
                        "Expect errors in decoding.");
                }
                input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

                do {
                    enc1 = keyStr.indexOf(input.charAt(i++));
                    enc2 = keyStr.indexOf(input.charAt(i++));
                    enc3 = keyStr.indexOf(input.charAt(i++));
                    enc4 = keyStr.indexOf(input.charAt(i++));

                    chr1 = (enc1 << 2) | (enc2 >> 4);
                    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                    chr3 = ((enc3 & 3) << 6) | enc4;

                    output = output + String.fromCharCode(chr1);

                    if (enc3 != 64) {
                        output = output + String.fromCharCode(chr2);
                    }
                    if (enc4 != 64) {
                        output = output + String.fromCharCode(chr3);
                    }

                    chr1 = chr2 = chr3 = "";
                    enc1 = enc2 = enc3 = enc4 = "";

                } while (i < input.length);

                return output;
            }
        };
    });
})();

2
आपको वास्तव में JS में डोम हेरफेर करने से दूर रहना चाहिए जब तक कि आपके निर्देश में। यदि आप सिर्फ अपना तर्क सेट करते हैं और फिर क्लास लगाने के लिए एनजी-क्लास का उपयोग करते हैं और सीएसएस एनीमेशन को ट्रिगर करते हैं जिसे आप बाद में खुद को धन्यवाद देंगे।
अक्सेडेनिग्नेर्स

7

आपकी app.js फ़ाइल में:

.run(["$rootScope", "$state", function($rootScope, $state) {

      $rootScope.$on('$locationChangeStart', function(event, next, current) {
        if (!$rootScope.loggedUser == null) {
          $state.go('home');
        }    
      });
}])

4

कोणीय-यूआई-राउटर के साथ किसी अन्य दृश्य को रीडायरेक्ट करना संभव है । इस उद्देश्य के लिए, हमारे पास विधि है $state.go("target_view")। उदाहरण के लिए:

 ---- app.js -----

 var app = angular.module('myApp', ['ui.router']);

 app.config(function ($stateProvider, $urlRouterProvider) {

    // Otherwise
    $urlRouterProvider.otherwise("/");

    $stateProvider
            // Index will decide if redirects to Login or Dashboard view
            .state("index", {
                 url: ""
                 controller: 'index_controller'
              })
            .state('dashboard', {
                url: "/dashboard",
                controller: 'dashboard_controller',
                templateUrl: "views/dashboard.html"
              })
            .state('login', {
                url: "/login",
                controller: 'login_controller',
                templateUrl: "views/login.html"
              });
 });

 // Associate the $state variable with $rootScope in order to use it with any controller
 app.run(function ($rootScope, $state, $stateParams) {
        $rootScope.$state = $state;
        $rootScope.$stateParams = $stateParams;
    });

 app.controller('index_controller', function ($scope, $log) {

    /* Check if the user is logged prior to use the next code */

    if (!isLoggedUser) {
        $log.log("user not logged, redirecting to Login view");
        // Redirect to Login view 
        $scope.$state.go("login");
    } else {
        // Redirect to dashboard view 
        $scope.$state.go("dashboard");
    }

 });

----- HTML -----

<!DOCTYPE html>
<html>
    <head>
        <title>My WebSite</title>

        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="description" content="MyContent">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <script src="js/libs/angular.min.js" type="text/javascript"></script>
        <script src="js/libs/angular-ui-router.min.js" type="text/javascript"></script>
        <script src="js/app.js" type="text/javascript"></script>

    </head>
    <body ng-app="myApp">
        <div ui-view></div>
    </body>
</html>

3

यदि आप कोणीय-यूआई-राउटर का उपयोग नहीं करना चाहते हैं, लेकिन अपने नियंत्रकों को आवश्यकता से अधिक आलसी लोड करना चाहते हैं, तो आवश्यकता होती है कि $routeChangeStartआपके नियंत्रक के रूप में आपके नियंत्रक का उपयोग करते समय घटना के साथ कुछ समस्याएं हों (आलसी लोड)।

आप सुनिश्चित नहीं हो सकते कि $routeChangeStartट्रिगर होने से पहले नियंत्रक लोड हो जाएगा - वास्तव में यह लोड नहीं होगा। इसका मतलब है कि आप nextरूट के गुणों को एक्सेस नहीं कर सकते हैं क्योंकि localsया $$routeवे अभी तक सेटअप नहीं हैं।
उदाहरण:

app.config(["$routeProvider", function($routeProvider) {
    $routeProvider.when("/foo", {
        controller: "Foo",
        resolve: {
            controller: ["$q", function($q) {
                var deferred = $q.defer();
                require(["path/to/controller/Foo"], function(Foo) {
                    // now controller is loaded
                    deferred.resolve();
                });
                return deferred.promise;
            }]
        }
    });
}]);

app.run(["$rootScope", function($rootScope) {
    $rootScope.$on("$routeChangeStart", function(event, next, current) {
        console.log(next.$$route, next.locals); // undefined, undefined
    });
}]);

इसका मतलब है कि आप वहां तक ​​पहुँच अधिकार नहीं देख सकते।

समाधान:

जैसा कि नियंत्रक के लोडिंग को रिज़ॉल्यूशन के माध्यम से किया जाता है, आप अपने एक्सेस कंट्रोल चेक के साथ भी ऐसा कर सकते हैं:

app.config(["$routeProvider", function($routeProvider) {
    $routeProvider.when("/foo", {
        controller: "Foo",
        resolve: {
            controller: ["$q", function($q) {
                var deferred = $q.defer();
                require(["path/to/controller/Foo"], function(Foo) {
                    // now controller is loaded
                    deferred.resolve();
                });
                return deferred.promise;
            }],
            access: ["$q", function($q) {
                var deferred = $q.defer();
                if (/* some logic to determine access is granted */) {
                    deferred.resolve();
                } else {
                    deferred.reject("You have no access rights to go there");
                }
                return deferred.promise;
            }],
        }
    });
}]);

app.run(["$rootScope", function($rootScope) {
    $rootScope.$on("$routeChangeError", function(event, next, current, error) {
        console.log("Error: " + error); // "Error: You have no access rights to go there"
    });
}]);

यहां ध्यान दें कि $routeChangeStartमैं ईवेंट का उपयोग करने के बजाय उपयोग कर रहा हूं$routeChangeError


-4
    $routeProvider
 .when('/main' , {templateUrl: 'partials/main.html',  controller: MainController})
 .when('/login', {templateUrl: 'partials/login.html', controller: LoginController}).
 .when('/login', {templateUrl: 'partials/index.html', controller: IndexController})
 .otherwise({redirectTo: '/index'});

यह एक मूल मार्ग कॉन्फ़िगरेशन है ... हम कॉन्फ़िगर किए गए मार्गों पर पुनर्निर्देशित करने से पहले किसी भी स्थिति की जांच कहां कर रहे हैं ..?
TJ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.