दिलचस्प पोस्ट
जावास्क्रिप्ट चर कैसे PHP पास करने के लिए? JSON.NET का उपयोग करके क्रमबद्ध क्षेत्रों का क्रम एक तितर बितर डेटा सेट का उपयोग करके MatPlotLib में एक हीटमैप उत्पन्न करें अन्य स्रोत के लिए पायथन खोज पथ का विस्तार करें गैर-विभाजन से विभाजित तालिकाओं में माइग्रेट करना कैसे एक सीएनएन सबडोमेन से एक आनेवाला अनुरोध (PHP स्क्रिप्ट के साथ) का पता लगाने के लिए? मैं अपने एक्लिप्स प्रोजेक्ट में javax.servlet API को कैसे आयात कर सकता हूं? पीडीओ के साथ एक तैयार डालने के बाद आखिरी प्रविष्टि आईडी प्राप्त करें टॉमकेट गिस / जेडीबीसी मेमोरी लीक <XMP> टैग के लिए क्या इस्तेमाल किया गया था? एसक्यूएल में महीना नाम समारोह में महीना संख्या को कनवर्ट करें एंड्रॉइड – मैं एक एएनआर की जांच कैसे करूं? ओरेकल: एकाधिक उपनामों को एक अल्पविराम से अलग किए गए मान में डुप्लिकेट में एक साथ जोड़ दें किसी स्थानीय फ़ाइल या यूआरएल से आईओ स्ट्रीम खोलें I एक डीव्ही ब्लॉक के अंदर सीएसएस केंद्र पाठ (क्षैतिज और अनुलंब)

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 नहीं होना चाहिए ()। मैंने भी घटना की कोशिश की। पूर्वव्यापार डीफॉल्ट () लेकिन कोई फायदा नहीं।

वेब के समाधान से एकत्रित समाधान "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(); } }) });