दिलचस्प पोस्ट
निष्पादित करने के लिए फ़ंक्शन द्वारा लिया गया समय मापने का तरीका कैसे अजाक्स अनुरोधों चेन करने के लिए? स्थानीय मेवेन प्रॉक्सी रिपॉजिटरी (नेक्सस) का उपयोग करने के लिए मैं एसबीटी कैसे प्राप्त करूं? मुझे "पैकेज 'xxx' के साथ कैसे निपटना चाहिए? '' चेतावनी के लिए (आर संस्करण xyz के लिए) उपलब्ध नहीं है? सी # /। नेट में स्थानीय मशीन का एफक्यूडीएन कैसे निकालना है? Google Play सेवाएं संस्करण कैसे जांचें? कार्य-क्रिया बटन के साथ मल्टी-लाइन संपादन टेक्स्ट एसएएच 1 कुंजी के लिए डीबग एंड रिलीज एंड्रॉइड स्टूडियो मैक मिलान करने के लिए और पंक्तियों को पंक्तिबद्ध करने के लिए Excel VBA सी फ़ंक्शन सिंटैक्स, पैरामीटर प्रकार घोषित किए गए पैरामीटर सूची के बाद जावास्क्रिप्ट 'बाइंड' विधि का उपयोग करें इकाई फ़्रेमवर्क कोड पहला अनन्य स्तंभ एकाधिक पंक्तियों को एक अल्पविराम-पृथक मान अजगर खिड़कियां पथ स्लैश कैसे जांचने के लिए कि क्या कनेक्शन स्ट्रिंग मान्य है?

AngularJs – रूट परिवर्तन ईवेंट को रद्द करें

मैं AngularJs में मार्ग परिवर्तन की घटना को कैसे रद्द करूं?

मेरा वर्तमान कोड है

$rootScope.$on("$routeChangeStart", function (event, next, current) { // do some validation checks if(validation checks fails){ console.log("validation failed"); window.history.back(); // Cancel Route Change and stay on current page } }); 

इस के साथ भी यदि सत्यापन विफल हो जाता है तो कोणीय अगले टेम्पलेट और संबंधित डेटा खींचता है और फिर तुरंत पिछले दृश्य / मार्ग पर वापस स्विच करता है। यदि सत्यापन विफल हो जाता है तो मैं अगले टेम्प्लेट और डेटा को खींचने के लिए कोणीय नहीं चाहता, आदर्श रूप से कोई window.history.back नहीं होना चाहिए ()। मैंने भी घटना की कोशिश की। पूर्वव्यापार डीफॉल्ट () लेकिन कोई फायदा नहीं।

Solutions Collecting From Web of "AngularJs – रूट परिवर्तन ईवेंट को रद्द करें"

$routeChangeStart बजाय $routeChangeStart $locationChangeStart उपयोग $routeChangeStart करें

इस बारे में angularjs लोगों से चर्चा है: https://github.com/angular/angular.js/issues/2109

उदाहरण:

 $scope.$on('$locationChangeStart', function(event) { if ($scope.form.$invalid) { event.preventDefault(); } }); 

एक और पूर्ण कोड नमूना, $locationChangeStart का उपयोग कर

 // assuming you have a module called app, with a angular.module('app') .controller( 'MyRootController', function($scope, $location, $rootScope, $log) { // your controller initialization here ... $rootScope.$on("$locationChangeStart", function(event, next, current) { $log.info("location changing to:" + next); }); } ); 

मैं पूरी तरह से अपने रूट नियंत्रक (शीर्ष स्तर नियंत्रक) में यह hooking के साथ खुश नहीं हूँ अगर एक बेहतर पैटर्न है, तो मुझे यह जानना अच्छा लगेगा मैं कोणीय के लिए नया हूँ 🙂

एक समाधान एक 'notAuthorized' घटना को प्रसारित करना है, और स्थान को फिर से बदलने के लिए उसे मुख्य दायरे में पकड़ना है मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है, लेकिन यह मेरे लिए काम किया है:

 myApp.run(['$rootScope', 'LoginService', function ($rootScope, LoginService) { $rootScope.$on('$routeChangeStart', function (event, next, current) { var authorizedRoles = next.data ? next.data.authorizedRoles : null; if (LoginService.isAuthenticated()) { if (!LoginService.isAuthorized(authorizedRoles)) { $rootScope.$broadcast('notAuthorized'); } } }); } ]); 

और मेरे मुख्य नियंत्रक में:

  $scope.$on('notAuthorized', function(){ $location.path('/forbidden'); }); 

नोट: कोणीय साइट पर इस समस्या के बारे में कुछ चर्चा है, अभी तक हल नहीं: https://github.com/angular/angular.js/pull/4192

संपादित करें:

टिप्पणी का जवाब देने के लिए, यहां लॉग-इन सेवा कार्यों के बारे में अधिक जानकारी दी गई है इसमें 3 फ़ंक्शन हैं:

  1. लॉगिन () (नाम गुमराह करने वाला है) सर्वर के लिए एक अनुरोध करते हैं (पहले) लॉग इन उपयोगकर्ता के बारे में जानकारी प्राप्त करने के लिए एक और लॉगिन पृष्ठ है जो बस सर्वर में वर्तमान उपयोगकर्ता स्थिति को पॉपुल कर रहा है (स्प्रिंग सिक्युरिटी फ्रेमवर्क का उपयोग करके)। मेरी वेब सेवाएँ वाकई स्टेटलेस नहीं हैं, लेकिन मुझे यह पसंद करना चाहिए कि प्रसिद्ध फ़्रेमवर्क मेरी सुरक्षा को संभाल सके।
  2. isAuthenticated () बस खोज अगर क्लाइंट सत्र डेटा से भरा है, जिसका अर्थ है कि इससे पहले प्रमाणीकृत किया गया है (*)
  3. हैअधिकृत () पहुंच अधिकार (इस विषय के लिए दायरे से बाहर) संभाला।

(*) मेरा सत्र तब आबादी है जब मार्ग बदलता है। मैंने ओवरराइड किया है, तब जब () विधि सत्र को आबाद करने के लिए जब खाली है

यहां कोड है:

 services.factory('LoginService', ['$http', 'Session', '$q', function($http, Session, $q){ return { login: function () { var defer = $q.defer(); $http({method: 'GET', url: restBaseUrl + '/currentUser'}) .success(function (data) { defer.resolve(data); }); return defer.promise; }, isAuthenticated: function () { return !!Session.userLogin; }, isAuthorized: function (authorizedRoles) { if (!angular.isArray(authorizedRoles)) { authorizedRoles = [authorizedRoles]; } return (this.isAuthenticated() && authorizedRoles.indexOf(Session.userRole) !== -1); } }; }]); myApp.service('Session', ['$rootScope', this.create = function (userId,userLogin, userRole, userMail, userName, userLastName, userLanguage) { //User info this.userId = userId; this.userLogin = userLogin; this.userRole = userRole; this.userMail = userMail; this.userName = userName; this.userLastName = userLastName; this.userLanguage = userLanguage; }; this.destroy = function () { this.userId = null; this.userLogin = null; this.userRole = null; this.userMail = null; this.userName = null; this.userLastName = null; this.userLanguage = null; sessionStorage.clear(); }; return this; }]); myApp.config(['$routeProvider', 'USER_ROLES', function ($routeProvider, USER_ROLES) { $routeProvider.accessWhen = function (path, route) { if (route.resolve == null) { route.resolve = { user: ['LoginService','Session',function (LoginService, Session) { if (!LoginService.isAuthenticated()) return LoginService.login().then(function (data) { Session.create(data.id, data.login, data.role, data.email, data.firstName, data.lastName, data.language); return data; }); }] } } else { for (key in route.resolve) { var func = route.resolve[key]; route.resolve[key] = ['LoginService','Session','$injector',function (LoginService, Session, $injector) { if (!LoginService.isAuthenticated()) return LoginService.login().then(function (data) { Session.create(data.id, data.login, data.role, data.email, data.firstName, data.lastName, data.language); return func(Session, $injector); }); else return func(Session, $injector); }]; } } return $routeProvider.when(path, route); }; //use accessWhen instead of when $routeProvider. accessWhen('/home', { templateUrl: 'partials/dashboard.html', controller: 'DashboardCtrl', data: {authorizedRoles: [USER_ROLES.superAdmin, USER_ROLES.admin, USER_ROLES.system, USER_ROLES.user]}, resolve: {nextEvents: function (Session, $injector) { $http = $injector.get('$http'); return $http.get(actionBaseUrl + '/devices/nextEvents', { params: { userId: Session.userId, batch: {rows: 5, page: 1} }, isArray: true}).then(function success(response) { return response.data; }); } } }) ... .otherwise({ redirectTo: '/home' }); }]); 

इस पर कोई भी ठोकर खा रहा है, एक पुराना सवाल है, (कम से कम कोणीय 1.4 में) आप यह कर सकते हैं:

  .run(function($rootScope, authenticationService) { $rootScope.$on('$routeChangeStart', function (event, next) { if (next.require == undefined) return var require = next.require var authorized = authenticationService.satisfy(require); if (!authorized) { $rootScope.error = "Not authorized!" event.preventDefault() } }) }) 

यह मेरा समाधान है और यह मेरे लिए काम करता है लेकिन मुझे नहीं पता कि मैं सही रास्ते पर हूं क्योंकि मैं वेब प्रौद्योगिकियों के लिए नया हूँ

 var app = angular.module("app", ['ngRoute', 'ngCookies']); app.run(function($rootScope, $location, $cookieStore){ $rootScope.$on('$routeChangeStart', function(event, route){ if (route.mustBeLoggedOn && angular.isUndefined($cookieStore.get("user"))) { // reload the login route jError( 'You must be logged on to visit this page', { autoHide : true, TimeShown : 3000, HorizontalPosition : 'right', VerticalPosition : 'top', onCompleted : function(){ window.location = '#/signIn'; window.setTimeout(function(){ }, 3000) } }); } }); }); app.config(function($routeProvider){ $routeProvider .when("/signIn",{ controller: "SignInController", templateUrl: "partials/signIn.html", mustBeLoggedOn: false }); 

यदि आपको रूट को $routeChangeStart मार्ग में बदलने से रोकना $routeChangeStart घटना (अर्थात आप अगले मार्ग के आधार पर कुछ आपरेशन करना चाहते हैं), $route और $routeChangeStart कॉल के अंदर इंजेक्षन करें:

 $route.reload() 

मैंने यह एक प्रासंगिक पाया

 var myApp = angular.module('myApp', []); myApp.run(function($rootScope) { $rootScope.$on("$locationChangeStart", function(event, next, current) { // handle route changes $rootScope.error = "Not authorized!" event.preventDefault() }); }); 

मेरी पोस्ट भविष्य में किसी एक को मदद कर सकती है

 var app=angular .module('myapp', []) .controller('myctrl', function($rootScope) { $rootScope.$on("locationChangeStart", function(event, next, current) { if (!confirm("location changing to:" + next)) { event.preventDefault(); } }) });