Angular.js(七)




自定义服务factory、provider

注意:(1)自定义服务与内部的服务引入相同

           (2)自定义服务要写在内部的服务后面,并且自定义服务的命名一般不要带$符号,目的就是与内部服务区分

factory自定义服务写法:

var m1 = angular.module('myApp',[]);
m1.factory('myService',function(){
	return {
		name : 'hello',
		show : function(){
			return this.name + ':angular.js';
		}
	}
})
m1.controller('A',['$scope','myService',function($scope,myService){
	console.log(myService.show());
}]);

provider自定义服务写法:

var m1 = angular.module('myApp',[]);
m1.provider('myServe',function(){
	return {
		$get : function(){
			return {
				name : 'hello',
				show : function(){
					return this.name+':anjular.js';
				}
			}
		}
	}
})
m1.controller('A',['$scope','myServe',function($scope,myServe){
	console.log(myServe.show());
}]);

factory自定义服务随机数:

var m1 = angular.module('myApp',[]);
m1.factory('myRanndomNum',function(){
	return function(num1,num2){
		return Math.random()*(num2-num1)+num1;
	}
})
m1.controller('A',['$scope','myRanndomNum',function($scope,myRanndomNum){
	console.log(myRanndomNum(0,8));
}]);

provider自定义服务随机数:

var m1 = angular.module('myApp',[]);
m1.provider('myRanndomNum',function(){
	return {
		bOn : false,
		int : function(b){
			if(b){
				this.bOn = true;
			}else{
				this.bOn = false;
			}
		},
		$get : function(){
			var This = this;
			return function(num1,num2){
				return This.bOn ? Math.round(Math.random()*(num2-num1)+num1):Math.random()*(num2-num1)+num1;
			}
		}				
	}
})
m1.config(['myRanndomNumProvider',function(myRanndomNumProvider){
	 myRanndomNumProvider.int(true);   // true时,打印出来的随机数是整数, false时,打印出来的suiji
}]);
m1.controller('A',['$scope','myRanndomNum',function($scope,myRanndomNum){
	console.log(myRanndomNum(0,8));
}]);

provider和factory的区别:

(1)写法不同

(2)provider可以初始化配置,但是factory不可以

service():一般采用构造函数的方法,主要就是针对面向对象开发

var m1 = angular.module('myApp',[]);
m1.service('myService',fnService);
function fnService(){
	this.name = 'hello';
}
fnService.prototype.age = 20;
m1.controller('A',['myService',function(myService){
	console.log(myService.age);    // 输出myService下的age值
}])

constant:设置常量,可以进行初始化配置,注意的是:服务的名称后面不需要加Provider

var m1 = angular.module('myApp',[]);
m1.constant('myService','hello');
m1.config(['myService',function(myService){
	console.log(myService);   // 在初始化配置中找到常量
}])
m1.controller('A',['myService',function(myService){
	console.log(myService);
}]);

value():设置常量,不能进行初始化配置

var m1 = angular.module('myApp',[]);
m1.value('myService','hello2');
m1.controller('A',['myService',function(myService){
	console.log(myService);
}]);

ngRoute:实现单页面路由方式,有历史管理

注意:引用route的插件时,需要与angularJs的版本保持一致,如果插件的版本高于angularJs的版本,就会报错

var m1 = angular.module('myApp',['ngRoute']);         // 模板与模板相连
m1.config(['$routeProvider',function($routeProvider){
	$routeProvider
	.when('/a',{
		template : '<p>导航一下的内容</p>{{name}}',    // 同时可以写成templateUrl模板的形式
		controller : 'A'           // 每一个下面都可以有一个控制器
	})
	.when('/b',{
		template : '<p>导航二下的内容</p>{{name}}',
		controller : 'B'
	})
	.when('/c',{
		template : '<p>导航三下的内容</p>{{name}}',
		controller : 'C'
	})
	.otherwise({     // 初始化路由,开始时加载一个哈希值
		redirectTo : '/a'
	});
}]);
m1.controller('A',['$scope',function($scope){
	$scope.name = "hello";
}]);
m1.controller('B',['$scope',function($scope){
	$scope.name = "hi";
}]);
m1.controller('C',['$scope',function($scope){
	$scope.name = "word";
}]);

<div ng-controller="A">
	<a href="#a">导航一</a>
	<a href="#b">导航二</a>
	<a href="#c">导航三</a>
	<div ng-view></div>   // ng-view 就是要切换的内容
</div>
事件的绑定:$on
m1.run(['$rootScope',function($rootScope){
	$rootScope.$on('$routeChangeStart',function(event,current,pre){  // 路由开始切换
		console.log(event);   // 类似原生js中的event,下面有属性和方法
		console.log(current); // 当前路径的数据
		console.log(pre);     // 前一个路径的所有数据,如果当前是第一个路径,name前一个了路径就是undefined
	})
}])

$emit:向上传播(类似于事件冒泡)

$broadcast:向下传播(类似于事件捕获)

var m1 = angular.module('myApp',[]);
m1.controller('A',['$scope',function($scope){
	$scope.number = 0;
	$scope.$on('myEvent',function(event){    // 绑定事件
		$scope.number++;
		console.log(event.targetScope == event.currentScope);   // 判断目标作用域和当前作用域是否一致
		console.log(event.name);    // 查看当前事件的名称
	})
}]);
<div ng-controller="A">
	{{number}}
	<div ng-controller="A" ng-click="$broadcast('myEvent')">  // 向下传播,下面的div中的数字和这个div一起变化
		{{number}} 
		<div ng-controller="A">
			{{number}}
		</div>
	</div>
</div>
event.targetScope:事件目标的作用域

event.currenScope:事件当前的作用域

event.name:查看当前的事件名称

event.stopPropagation:阻止事件的向下广播或者向上广播

内部的传播方式

-$routeChangeStart:向上传播

-$viewContentLoaded:向下传播

animate:运动效果,引入文件

支持的指令分别有:ng-if   ng-view   ng-repeat  include  switch

css3的方式:ng-enter  ng-enter-active  ng-leave  ng-leave-active  (分别是进入效果和移出效果)

.box{width: 200px;height: 200px;background: red;transition:1s all;}
.box.ng-enter{opacity: 0;}
.box.ng-enter-active{opacity: 1;}
.box.ng-leave{opacity: 1;}
.box.ng-leave-active{opacity: 0;}
var m1 = angular.module('myApp',['ngAnimate']);   // 与模块相连
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);
<div ng-controller="A">
	<input type="checkbox" ng-model="bOn">
	<div ng-if="bOn" class="box"></div>
</div>

ng-repeat:引入的文件最好是最新的文件,同时又两个class名称,ng-enter-stagger:进入顺序    animation-delay:设置延时的时间

支持的指令分别有:class  show  hide  model  

css3的方式:ng-hide-add  ng-hide-add-active  ng-hide-remove  ng-hide-remove-active 

.box{width: 200px;height: 200px;background: red;transition:1s all;}
.box.ng-hide-remove{opacity: 0;}
.box.ng-hide-remove-active{opacity: 1;}
.box.ng-hide-add{opacity: 1;}
.box.ng-hide-add-active{opacity: 0;}

采用JS方式的运动效果

引入jQuery文件

如果指令是 if  对应写的就是 leave 和 enter(两个参数)

var m1 = angular.module('myApp',['ngAnimate']);
m1.animation('.box',function(){   // 第一个参数是 想要控制谁运动的class名
	return {
		leave : function(element,done){   // element:运动的标签  done:需要执行的指令
			$(element).animate({height:0,width:0},500,done);    // 写done就是要调用的指令
		},
		enter : function(element,done){    
			$(element).css({height:0,width:0});
			$(element).animate({height:'200px',width:"200px"},500,done)
		}
	}
})
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);

如果指令是 show  对应写的就是 removeClass 和 addClass(不常用,写的时候有三个参数)

var m1 = angular.module('myApp',['ngAnimate']);
m1.animation('.box',function(){
	return {
		addClass : function(element,sClass,done){   // 三个参数 sClass:代表的就是ng-hide
			$(element).animate({height:0,width:0},500,done);
		},
		removeClass : function(element,sClass,done){
			$(element).css({height:0,width:0});
			$(element).animate({height:'200px',width:"200px"},500,done)
		}
	}
})
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);

请求方式:get query

最后查找的就是Hellen.json文件

var m1 = angular.module('myApp',['ngResource']);
m1.controller('A',['$scope','$resource',function($scope,$resource){
	var obj = $resource(':name.:aaa',{aaa:'json'},{});  // 动态的方式写文件
	console.log(obj.get());
	$scope.data = obj.get({name:'Hellen'},function(){},function(){}); // 文件名  成功的回调 失败的回调
}]);
采用 get 方式,点击切换员工的信息

引入路由文件

var m1 = angular.module('myApp',['ngRoute','ngResource']);   // 模块与模块的相连
m1.config(['$routeProvider',function($routeProvider){
	$routeProvider
	.when('/aaa/:name',{
		template : '<div>{{data.name}}</div><div>{{data.age}}</div><div>{{data.job}}</div>',
		controller : 'A'
	})
	.otherwise({
		redirectTo : '/aaa/Anna'  
	})
}]);
m1.controller('A',['$scope','$location','$resource','$routeParams',function($scope,$location,$resource,$routeParams){
	$scope.$location = $location;
	if($routeParams.name){
		var obj = $resource($routeParams.name+'.json',{},{});
		$scope.data = obj.get();
	}	
}]);
<div ng-controller="A">
	<input type="button" value="Anna" ng-click="$location.path('aaa/Anna')">   // 动态设置
	<input type="button" value="Hellen" ng-click="$location.path('aaa/Hellen')">
	<div ng-view></div>
</div>

如果数据为成组的json,也就是一数组的形式返回,那么就需要用 query 来获取数据



自定义服务factory、provider

注意:(1)自定义服务与内部的服务引入相同

           (2)自定义服务要写在内部的服务后面,并且自定义服务的命名一般不要带$符号,目的就是与内部服务区分

factory自定义服务写法:

var m1 = angular.module('myApp',[]);
m1.factory('myService',function(){
	return {
		name : 'hello',
		show : function(){
			return this.name + ':angular.js';
		}
	}
})
m1.controller('A',['$scope','myService',function($scope,myService){
	console.log(myService.show());
}]);

provider自定义服务写法:

var m1 = angular.module('myApp',[]);
m1.provider('myServe',function(){
	return {
		$get : function(){
			return {
				name : 'hello',
				show : function(){
					return this.name+':anjular.js';
				}
			}
		}
	}
})
m1.controller('A',['$scope','myServe',function($scope,myServe){
	console.log(myServe.show());
}]);

factory自定义服务随机数:

var m1 = angular.module('myApp',[]);
m1.factory('myRanndomNum',function(){
	return function(num1,num2){
		return Math.random()*(num2-num1)+num1;
	}
})
m1.controller('A',['$scope','myRanndomNum',function($scope,myRanndomNum){
	console.log(myRanndomNum(0,8));
}]);

provider自定义服务随机数:

var m1 = angular.module('myApp',[]);
m1.provider('myRanndomNum',function(){
	return {
		bOn : false,
		int : function(b){
			if(b){
				this.bOn = true;
			}else{
				this.bOn = false;
			}
		},
		$get : function(){
			var This = this;
			return function(num1,num2){
				return This.bOn ? Math.round(Math.random()*(num2-num1)+num1):Math.random()*(num2-num1)+num1;
			}
		}				
	}
})
m1.config(['myRanndomNumProvider',function(myRanndomNumProvider){
	 myRanndomNumProvider.int(true);   // true时,打印出来的随机数是整数, false时,打印出来的suiji
}]);
m1.controller('A',['$scope','myRanndomNum',function($scope,myRanndomNum){
	console.log(myRanndomNum(0,8));
}]);

provider和factory的区别:

(1)写法不同

(2)provider可以初始化配置,但是factory不可以

service():一般采用构造函数的方法,主要就是针对面向对象开发

var m1 = angular.module('myApp',[]);
m1.service('myService',fnService);
function fnService(){
	this.name = 'hello';
}
fnService.prototype.age = 20;
m1.controller('A',['myService',function(myService){
	console.log(myService.age);    // 输出myService下的age值
}])

constant:设置常量,可以进行初始化配置,注意的是:服务的名称后面不需要加Provider

var m1 = angular.module('myApp',[]);
m1.constant('myService','hello');
m1.config(['myService',function(myService){
	console.log(myService);   // 在初始化配置中找到常量
}])
m1.controller('A',['myService',function(myService){
	console.log(myService);
}]);

value():设置常量,不能进行初始化配置

var m1 = angular.module('myApp',[]);
m1.value('myService','hello2');
m1.controller('A',['myService',function(myService){
	console.log(myService);
}]);

ngRoute:实现单页面路由方式,有历史管理

注意:引用route的插件时,需要与angularJs的版本保持一致,如果插件的版本高于angularJs的版本,就会报错

var m1 = angular.module('myApp',['ngRoute']);         // 模板与模板相连
m1.config(['$routeProvider',function($routeProvider){
	$routeProvider
	.when('/a',{
		template : '<p>导航一下的内容</p>{{name}}',    // 同时可以写成templateUrl模板的形式
		controller : 'A'           // 每一个下面都可以有一个控制器
	})
	.when('/b',{
		template : '<p>导航二下的内容</p>{{name}}',
		controller : 'B'
	})
	.when('/c',{
		template : '<p>导航三下的内容</p>{{name}}',
		controller : 'C'
	})
	.otherwise({     // 初始化路由,开始时加载一个哈希值
		redirectTo : '/a'
	});
}]);
m1.controller('A',['$scope',function($scope){
	$scope.name = "hello";
}]);
m1.controller('B',['$scope',function($scope){
	$scope.name = "hi";
}]);
m1.controller('C',['$scope',function($scope){
	$scope.name = "word";
}]);

<div ng-controller="A">
	<a href="#a">导航一</a>
	<a href="#b">导航二</a>
	<a href="#c">导航三</a>
	<div ng-view></div>   // ng-view 就是要切换的内容
</div>
事件的绑定:$on
m1.run(['$rootScope',function($rootScope){
	$rootScope.$on('$routeChangeStart',function(event,current,pre){  // 路由开始切换
		console.log(event);   // 类似原生js中的event,下面有属性和方法
		console.log(current); // 当前路径的数据
		console.log(pre);     // 前一个路径的所有数据,如果当前是第一个路径,name前一个了路径就是undefined
	})
}])

$emit:向上传播(类似于事件冒泡)

$broadcast:向下传播(类似于事件捕获)

var m1 = angular.module('myApp',[]);
m1.controller('A',['$scope',function($scope){
	$scope.number = 0;
	$scope.$on('myEvent',function(event){    // 绑定事件
		$scope.number++;
		console.log(event.targetScope == event.currentScope);   // 判断目标作用域和当前作用域是否一致
		console.log(event.name);    // 查看当前事件的名称
	})
}]);
<div ng-controller="A">
	{{number}}
	<div ng-controller="A" ng-click="$broadcast('myEvent')">  // 向下传播,下面的div中的数字和这个div一起变化
		{{number}} 
		<div ng-controller="A">
			{{number}}
		</div>
	</div>
</div>
event.targetScope:事件目标的作用域

event.currenScope:事件当前的作用域

event.name:查看当前的事件名称

event.stopPropagation:阻止事件的向下广播或者向上广播

内部的传播方式

-$routeChangeStart:向上传播

-$viewContentLoaded:向下传播

animate:运动效果,引入文件

支持的指令分别有:ng-if   ng-view   ng-repeat  include  switch

css3的方式:ng-enter  ng-enter-active  ng-leave  ng-leave-active  (分别是进入效果和移出效果)

.box{width: 200px;height: 200px;background: red;transition:1s all;}
.box.ng-enter{opacity: 0;}
.box.ng-enter-active{opacity: 1;}
.box.ng-leave{opacity: 1;}
.box.ng-leave-active{opacity: 0;}
var m1 = angular.module('myApp',['ngAnimate']);   // 与模块相连
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);
<div ng-controller="A">
	<input type="checkbox" ng-model="bOn">
	<div ng-if="bOn" class="box"></div>
</div>

ng-repeat:引入的文件最好是最新的文件,同时又两个class名称,ng-enter-stagger:进入顺序    animation-delay:设置延时的时间

支持的指令分别有:class  show  hide  model  

css3的方式:ng-hide-add  ng-hide-add-active  ng-hide-remove  ng-hide-remove-active 

.box{width: 200px;height: 200px;background: red;transition:1s all;}
.box.ng-hide-remove{opacity: 0;}
.box.ng-hide-remove-active{opacity: 1;}
.box.ng-hide-add{opacity: 1;}
.box.ng-hide-add-active{opacity: 0;}

采用JS方式的运动效果

引入jQuery文件

如果指令是 if  对应写的就是 leave 和 enter(两个参数)

var m1 = angular.module('myApp',['ngAnimate']);
m1.animation('.box',function(){   // 第一个参数是 想要控制谁运动的class名
	return {
		leave : function(element,done){   // element:运动的标签  done:需要执行的指令
			$(element).animate({height:0,width:0},500,done);    // 写done就是要调用的指令
		},
		enter : function(element,done){    
			$(element).css({height:0,width:0});
			$(element).animate({height:'200px',width:"200px"},500,done)
		}
	}
})
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);

如果指令是 show  对应写的就是 removeClass 和 addClass(不常用,写的时候有三个参数)

var m1 = angular.module('myApp',['ngAnimate']);
m1.animation('.box',function(){
	return {
		addClass : function(element,sClass,done){   // 三个参数 sClass:代表的就是ng-hide
			$(element).animate({height:0,width:0},500,done);
		},
		removeClass : function(element,sClass,done){
			$(element).css({height:0,width:0});
			$(element).animate({height:'200px',width:"200px"},500,done)
		}
	}
})
m1.controller('A',['$scope',function($scope){
	$scope.bOn = true;
}]);

请求方式:get query

最后查找的就是Hellen.json文件

var m1 = angular.module('myApp',['ngResource']);
m1.controller('A',['$scope','$resource',function($scope,$resource){
	var obj = $resource(':name.:aaa',{aaa:'json'},{});  // 动态的方式写文件
	console.log(obj.get());
	$scope.data = obj.get({name:'Hellen'},function(){},function(){}); // 文件名  成功的回调 失败的回调
}]);
采用 get 方式,点击切换员工的信息

引入路由文件

var m1 = angular.module('myApp',['ngRoute','ngResource']);   // 模块与模块的相连
m1.config(['$routeProvider',function($routeProvider){
	$routeProvider
	.when('/aaa/:name',{
		template : '<div>{{data.name}}</div><div>{{data.age}}</div><div>{{data.job}}</div>',
		controller : 'A'
	})
	.otherwise({
		redirectTo : '/aaa/Anna'  
	})
}]);
m1.controller('A',['$scope','$location','$resource','$routeParams',function($scope,$location,$resource,$routeParams){
	$scope.$location = $location;
	if($routeParams.name){
		var obj = $resource($routeParams.name+'.json',{},{});
		$scope.data = obj.get();
	}	
}]);
<div ng-controller="A">
	<input type="button" value="Anna" ng-click="$location.path('aaa/Anna')">   // 动态设置
	<input type="button" value="Hellen" ng-click="$location.path('aaa/Hellen')">
	<div ng-view></div>
</div>

如果数据为成组的json,也就是一数组的形式返回,那么就需要用 query 来获取数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值