Angular的run方法巧妙运用 (转载)
1.浏览器判断
在angular做微信应用的时候,有时候我们也想把相同一份代码运行在非微信的浏览器上,这时候我们可以在angular的run上写点东西实现~
例如asw.run函数里执行定义一个$rootScope.isWeiXinLogin的函数
1 .run(['$rootScope', '$route', '$window', '$location', 'Position', '$cookies', 'Request', '$cookieStore', 2 function($rootScope, $route, $window, $location, position, $cookies, request, $cookieStore) { 3 //非微信的登陆 4 $rootScope.isWeiXinLogin = function() { 5 //判断是否微信登陆 6 var ua = window.navigator.userAgent.toLowerCase(); 7 //console.log(ua); //mozilla/5.0 (iphone; cpu iphone os 9_1 like mac os x) applewebkit/601.1.46 (khtml, like gecko) version/9.0 mobile/13b143 safari/601.1 8 if (ua.match(/MicroMessenger/i) == 'micromessenger') { 9 console.log(" 是来自微信内置浏览器"); 10 return true; 11 } else { 12 console.log("不是来自微信内置浏览器"); 13 return false; 14 } 15 }; 16 ]);
这样它能在应用的其他部分之前提前被执行,然后根据$rootScope.isWeiXinLogin的返回我们可以在不同的视图或者控制器有效的进行判断是否为微信浏览器
1 angular.module('autumnswind').controller('OrderCtrl', ['$rootScope', '$scope', 'Request', '$cookies', '$window', '$routeParams', '$location', 'Tool', 2 function($rootScope, $scope, request, $cookies, $window, $routeParams, $location, tool) { 3 if ($rootScope.isWeiXinLogin()) { 4 ... 5 } 6 } 7 ]);
2.登陆判断
在run里面写登陆判断是一种不错的方案,例如下面我写的这段,配合cookie和我上面的浏览器判断,当我加载页面的时候我就可以调用$rootScope.goLogin方案来判断是否这个路由所在的视图为登陆,如果有这个合法cookie就让它继续运行,不然则返回login页面进行登陆~
1 $rootScope.goLogin = function(replace) { 2 if ($rootScope.isWeiXinLogin()) { 3 if (!replace) { 4 $cookieStore.remove('loginBack'); 5 delete $cookies.loginBack; 6 $location.path('login'); 7 } else { 8 $cookies.loginBack = $location.path(); 9 $location.path('login').replace(); 10 } 11 } else { 12 $cookieStore.remove('loginBack'); 13 delete $cookies.loginBack; 14 $location.path('loginWebapp'); 15 } 16 };
3.白名单设置
曾经写过一个这样的函数来实现路由的参数判断,来设置白名单,那时候这个函数还放在全局变量里面~其实回头想想算是不大好的方法
1 var getParam = function(name) { 2 var search = document.location.search; 3 var pattern = new RegExp("[?&]" + name + "\=([^&]+)", "g"); 4 var matcher = pattern.exec(search); 5 var items = null; 6 if (null != matcher) { 7 try { 8 items = decodeURIComponent(decodeURIComponent(matcher[1])); 9 } catch (e) { 10 try { 11 items = decodeURIComponent(matcher[1]); 12 } catch (e) { 13 items = matcher[1]; 14 } 15 } 16 } 17 return items; 18 }; 19 //这个是根据路由name来决定进入那个parts 20 window.cats = getParam('AutumnsWind');
后来改进了下面这个简单的例子,就可以不用用上面那句代码来实现了
1 $rootScope.$on('$routeChangeSuccess', 2 function() { 3 var route = window.location.href; 4 if (route.indexOf('/hello/') != -1 && route.indexOf('/autumnswind/') != -1) { 5 window.AutumnsWindShareUrl = window.location.href; 6 } else if (route.indexOf('#/index') != -1) { 7 window.AutumnsWindShareUrl = window.location.href; 8 } else if (route.indexOf('#/asw'scat/') != -1) { 9 window.AutumnsWindShareUrl = window.location.href; 10 } else { 11 //跳转下载页面 12 window.AutumnsWindShareUrl = '~autumns~.cn'; 13 } 14 );
上面我们根据路由发生的变化进行白名单的设置,复杂点的话可以运用一下正则,这样就能很好的过滤我们禁止的url,由于例子就不写这么复杂啦~
4.设置公共参数
这个其实就不用写例子了,因为上面的例子也算是这个的一部分吧~
转载自:https://www.talkingcoder.com/article/6357513937071575461