**1.浏览器判断**
在angular做微信应用的时候,有时候我们也想把相同一份代码运行在非微信的浏览器上,这时候我们可以在angular的run上写点东西实现~
例如asw.run函数里执行定义一个$rootScope.isWeiXinLogin的函数

.run(['$rootScope', '$route', '$window', '$location', 'Position', '$cookies', 'Request', '$cookieStore',
function($rootScope, $route, $window, $location, position, $cookies, request, $cookieStore) {
//非微信的登陆
$rootScope.isWeiXinLogin = function() {
//判断是否微信登陆
var ua = window.navigator.userAgent.toLowerCase();
//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
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
console.log(" 是来自微信内置浏览器");
return true;
} else {
console.log("不是来自微信内置浏览器");
return false;
}
};
]);

  这样它能在应用的其他部分之前提前被执行,然后根据$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页面进行登陆~

$rootScope.goLogin = function(replace) {
if ($rootScope.isWeiXinLogin()) {
if (!replace) {
$cookieStore.remove('loginBack');
delete $cookies.loginBack;
$location.path('login');
} else {
$cookies.loginBack = $location.path();
$location.path('login').replace();
}
} else {
$cookieStore.remove('loginBack');
delete $cookies.loginBack;
$location.path('loginWebapp');
}
};

  **3.白名单设置**

var getParam = function(name) {
var search = document.location.search;
var pattern = new RegExp("[?&]" + name + "\=([^&]+)", "g");
var matcher = pattern.exec(search);
var items = null;
if (null != matcher) {
try {
items = decodeURIComponent(decodeURIComponent(matcher[1]));
} catch (e) {
try {
items = decodeURIComponent(matcher[1]);
} catch (e) {
items = matcher[1];
}
}
}
return items;
};
//这个是根据路由name来决定进入那个parts
window.cats = getParam('AutumnsWind');

  后来改进了下面这个简单的例子,就可以不用用上面那句代码来实现了

$rootScope.$on('$routeChangeSuccess',
function() {
var route = window.location.href;
if (route.indexOf('/hello/') != -1 && route.indexOf('/autumnswind/') != -1) {
window.AutumnsWindShareUrl = window.location.href;
} else if (route.indexOf('#/index') != -1) {
window.AutumnsWindShareUrl = window.location.href;
} else if (route.indexOf('#/asw'scat/') != -1) {
window.AutumnsWindShareUrl = window.location.href;
} else {
//跳转下载页面
window.AutumnsWindShareUrl = '~autumns~.cn';
}
);

  上面我们根据路由发生的变化进行白名单的设置,复杂点的话可以运用一下正则,这样就能很好的过滤我们禁止的url,由于例子就不写这么复杂啦~

**4.设置公共参数**
这个其实就不用写例子了,因为上面的例子也算是这个的一部分吧~
后面有时间慢慢补充~

状态改变事件

$scope.$on('$stateChangeStart',
function(event, toState, toParams, fromState, fromParams), {
// 如果需要阻止事件的完成
event.preventDefault();
});
我先说说这里面的这些参数
event:该事件的基本信息
toState:我们可以得到当前路由的信息,比如路由名称,url,视图的控制器,模板路径等等
toParams:我们可以得到当前路由的参数
fromState:我们可以得到上一个路由的信息,比如路由名称,url,视图的控制器,模板路径等等

fromParams:我们可以得到上一个路由的参数

可以触发的事件包括:

stateChangeStart

当状态改变开始的时候被触发

$stateChangeSuccess

当状态改变成功后被触发

$stateChangeError

当状态改变遇到错误时被触发,错误通常是目标无法载入,需要预载入的数据无法被载入等

曾经写过一个这样的函数来实现路由的参数判断,来设置白名单,那时候这个函数还放在全局变量里面~其实回头想想算是不大好的方法

var ydCreditApp = angular
.module('ydCreditApp', [
'ngAnimate',
'ngCookies',
'ngResource',
'ngSanitize',
'ngTouch',
'ui.router',
'ui.bootstrap',
'datatablesDirectives',
'ngTable',
'ncy-angular-breadcrumb',
// 'angularFileUpload',
// 'smart-table',
'ngFileUpload',
'MessageCenterModule',
'angular-loading-bar',
'toggle-switch',
'invalidModule'
])
.run(
['$rootScope', '$state', '$stateParams', 'AppSession',
function($rootScope, $state, $stateParams, AppSession) {
$rootScope.$state = $state;
console.log($rootScope.$state)
$rootScope.$stateParams = $stateParams; $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$state.previous = fromState;
$state.previousParams = fromParams;
if (toState.data.requiredLogin && !AppSession.getLogin()) {
$state.go('loginByMobile', {}, {
reload: true
});
event.preventDefault();
}
}); $rootScope.$on("$stateChangeSuccess", function(event, toState, toParams, fromState, fromParams) {
$rootScope.previousState_name = fromState.name;
$rootScope.previousState_params = fromParams;
}); }
]
).directive('repeatFinish',function(){
return {
link: function($scope,element,attr){
if($scope.$last === true){
//为了防止页面中的值还没有渲染出来,所以添加Timeout来解决
setTimeout(function(){ $scope.$eval( attr.repeatFinish );},1000);
}
}
};
}).config(['cfpLoadingBarProvider', function (cfpLoadingBarProvider) {
cfpLoadingBarProvider.latencyThreshold = 0;
cfpLoadingBarProvider.spinnerTemplate = '<div class="loading-bar-background"><div class="center" id="loading-bar-spinner"><div class="padding"></div><div class="spinner-icon"></div><div class="text">正在执行中,请稍后......</div></div>';
}])
.config(
['$stateProvider', '$urlRouterProvider', '$breadcrumbProvider', '$httpProvider',
function($stateProvider, $urlRouterProvider, $breadcrumbProvider, $httpProvider) {
$httpProvider.interceptors.push('TokenInterceptor');
// if(!IsPC){
// alert("请在PC端登录!");
// return;
// } $urlRouterProvider.otherwise('/');
$stateProvider
.state('loginByMobile', {
url: '/',
templateUrl: 'views/login/loginByMobile.html',
controller: 'loginCtrl',
data: {
requiredLogin: false
}
})

  $state.go

  $state.go('main.approvedList', {
'type': '所有',
'page':$scope.page,
'ros':$scope.ros,
'mobile':$scope.mobile,
'name':$scope.name ,
'sendCity':$scope.sendCity ,
'arriveCity':$scope.arriveCity ,
'approvedStatus':$scope.approvedStatus ,
'minCreateTime':$scope.minCreateTime ,
'maxCreateTime':$scope.maxCreateTime ,
'minApproveTime':$scope.minApproveTime ,
'maxApproveTime':$scope.maxApproveTime }, {reload: true});

  

angular.run 妙用的更多相关文章

  1. angular run()运行块

    和配置块不同,运行块在注入器创建之后被执行,它是所有AngularJS应用中第一个被执行的方法. 运行块是AngularJS中与main方法最接近的概念.运行块中的代码块通常很难进行单元测试,它是和应 ...

  2. angular.run和angular.config的区别

    ng的运行机制: config阶段是给了ng上下文一个针对constant与provider修改其内部属性的一个阶段 而run阶段是在config之后的在运行独立的代码块,通常写法runBlock 简 ...

  3. angular+ionic前后端分离开发项目中的使用

    Ionic基于AngularJS构建而成,所以学习一些AngularJS的知识很有必要.Ionic并没有独立开发一套完整的Web应用框架,而是对AngularJS进行了扩展,给它添加了大量界面组件和其 ...

  4. Angular入门到精通系列教程(6)- Angular的升级

    1. 摘要 2. https://update.angular.io/ 3. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 Node: 12.18.3 npm ...

  5. angular1.x + ES6开发风格记录

    angular1.x和ES6开发风格 一.Module ES6有自己的模块机制,所以我们要通过使用ES6的模块机制来淡化ng的框架,使得各业务逻辑层的看不出框架的痕迹,具体的做法是: 把各功能模块的具 ...

  6. ionic准备之angular基础——run方法(4)

    可以看到整个angular.module对象具有以下各种属性和方法 <!DOCTYPE html> <html lang="en"> <head> ...

  7. angular 子路由跳转出现Navigation triggered outside Angular zone, did you forget to call ‘ngZone.run() 的问题修复

    angular 路由功能非常强大,同时angular的路由也非常脆弱,非常容易出现错误. 那么在我们遇到异常时,首先要做的是什么? 第一步:检查代码,对比官方文档,发现代码中不一致的地方进行改正. 第 ...

  8. Angular 开发小妙招1:提交表单数据验证不通过,更改输入组件的样式

    开发表单时,客户端数据完整性校验是必不可少的,在jquery 时代出现了无数的数据验证插件也很好用,开发Angular 应用时,angular 内置了一些常用的数据验证指令.今天要讲的不是这些指令如何 ...

  9. 快速的熟悉一个angular的项目从run看起

    config之类的都会注入到controller或者run里边

随机推荐

  1. linux 定时任务未执行php脚本

    1,对于无法执行php文件,首先你应该考虑的问题是是否php代码有错误,你可以先检查一下你的php代码,或者可以在linux上面执行一下这个文件,看是否能够执行成功:如果成功了,就说明是crontab ...

  2. rsh命令配置于使用

    安装环境:一台centos6.10虚拟机,一台centos7.5虚拟机,全部使用root用户登录. 两台机器上都要安装rsh.rsh-server.xinetd包. 两台机器都要关闭防火墙并配置/et ...

  3. Linux 调优

    一.系统优化 1.硬件优化 增加内存 更换速度跟高磁盘(sata->sas)可以增加固态硬盘 更换更高校率的网卡,或者双网卡绑定,两个网卡作为一个网卡使用.服务器网卡一般为千兆 2.系统层优化 ...

  4. Linux 安装扩展yum源

    Linux 安装扩展yum源 下载rpm扩展:http://rpmfind.net/linux/epel/6/x86_64/epel-release-6-8.noarch.rpm CentOS/RHE ...

  5. Bürkert 流体控制系统 (8611 型通用调节器)

    Type Description High-Tech Made EasyThe new universal controller eCONTROL Type 8611 brings an essent ...

  6. 进程控制块PCB结构体 task_struct 描述

    进程控制块,英文名(Processing Control Block),简称 PCB . 进程控制块是系统为了管理进程设置的一个专门的数据结构,主要表示进程状态. 每一个进程都对应一个PCB来维护进程 ...

  7. 获取本地IP并设置到QLineEdit中

    #include <QHostAddress> #include <QNetworkInterface> #include <QHostInfo> QString ...

  8. python 中文字符的处理

    刚开始学习python的时候,都是对这英文的翻译书学习的.没有解除到中文编码的相关问题,直到自己用python去做相关的项目的时候才发先中文编码问题真的非常头疼啊.这里分享一下本人所了解的一些经验. ...

  9. Bootstrap3全局CSS样式

    目录 1. 概览 2. 栅栏系统 3. 文本 4. 列表 5. 代码 6. 表格 7. 表单 7.1 基本实例 7.2 内联表单 7.3 水平排列的表单 8. 按钮 9. 图片 10. 辅助类 10. ...

  10. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...