AngularJS(八)

今天…今天还是继续学习服务,害,惭愧,这几天进度很慢,就这么几个服务知识点还没捣腾明白呢

$log服务
这个服务的功能是对console进行封装,好像很多服务的功能都是封装某个特定的对象

$log服务一共提供了5个方法,分别是:
log、warn、info、error、debug

	<body ng-app="app">
		<div ng-controller="ctrl">
			<label>
				请输入内容
			    <input type="text" ng-model="content" />
			</label>
			<button ng-click="$log.log(content)">log</button>
			<button ng-click="$log.warn(content)">warn</button>
			<button ng-click="$log.info(content)">info</button>
			<button ng-click="$log.error(content)">error</button>
			<button ng-click="$log.debug(content)">debug</button>
		</div>
		<script>
			angular.module("app",[])
			   .controller("ctrl",function($log,$scope){
				  
				  $scope.$log = $log; 
			   });
		</script>
	</body>

在这里插入图片描述
他的主要作用就是在输出台生成5中级别的提示信息
不过第5个debug级别的提示信息我不知道是什么样的,点击按钮没反应

$q服务
该服务是AngularJS封装的一种轻量级Promise的实现。它可以调用他的构造器(调用构造器的时候返回一个Promise对象),也可以调用下列方法:
defer():创建一个deferred对象,这个对象可以执行几个常用的方法,比如resolve
all():传入Promise的数组,用于批量执行,该方法也返回一个Promise对象
when():传入一个不确定的参数,如果参数符合Promise标准,就返回一个Promise对象
那么问题来了,什么是Promise呢,之前js学的不够扎实,忘了
 Promise,他是一个对象,是用来处理异步操作的,可以让我们写异步调用的时候写起来更加优雅,更加美观便于阅读。顾名思义为承诺、许诺的意思,意思是使用了Promise之后他肯定会给我们答复,无论成功或者失败都会给我们一个答复,所以我们就不用担心他跑了哈哈。所以,Promise有三种状态:pending(进行中),resolved(完成),rejected(失败)。只有异步返回的结构可以改变其状态。所以,promise的过程一般只有两种:pending->resolved或者pending->rejected。

<body ng-app="app" ng-controller="ctrl">
		<script>
			function loadData(url){
				console.log("从"+url+"加载数据");
				return "xxx";
			}
			angular.module("app",[])
			   .controller('ctrl',function($scope,$q){
				   function asyncTask(url){
					   return $q(function(resolve,reject){
						   setTimeout(function(){
							   var data = loadData(url);
							   if(data){
								   resolve(data);
							   }
							   else{
								   reject('加载失败');
							   }
						   },1000);
					   });
				   }
				   var promise = asyncTask('server.html');
				   promise.then(function(data){
					   alert('成功'+data);
				   },function(reason){
					   alert('失败'+reason);
				   });
			   });
		</script>
	</body>

这个就是实现了返回成功或失败的消息

<body ng-app="app" ng-controller="ctrl">
		<script>
			function loadData(url){
				console.log("从"+url+"加载数据");
				return "xxx";
			}
			angular.module("app",[])
			   .controller('ctrl',function($scope,$q){
				   function asyncTask(url){
					   var deferred = $q.defer();
					   setTimeout(function(){
						   deferred.notify('开始调用loadData方法');
						   var data = loadData(url);
						   if(data){
							   deferred.resolve(data);
						   }
						   else{
							   deferred.reject('加载数据失败');
						   }
					   },1000);
					   return deferred.promise;
				   }
				   var promise = asyncTask('server.html');
				   promise.then(function(data){
					   alert('成功加载数据:'+data);
				   },function(reason){
					   alert('失败:'+reason);
				   },function(update){
					   alert('收到通知:'+update);
				   });
			   });
		</script>
	</body>

上面是使用defer()方法得到和返回对象的代码

$templateCache服务
专门用于缓存页面模板,该服务是基于$cacheFactoy服务的(又是一个没听过的东西),感觉这些服务很多都是起到了封装一下的作用,真正的方法和不封装的其实类似。
书上说,可以把$templateCache当成#cacheFactory的实例

$templateCache = $ cacheFactory('template');

该服务的具体作用就是将HTML字符串缓存在内存中,当加载时可以直接从内存获取,从而获得更好的效率。
ng的script标签同样可以做到

	<body ng-app="app">
		<div ng-controller="ctrl">
			<select ng-model="template" >
				<option value="">空白</option>
				<option value="fkit.html">fk</option>
				<option value="yeeku.html">ye</option>
			</select>
			被加载的URl:<code>{{template}}</code>
			
			<hr/>
			<div class="s">
				<div class="sss" ng-include="template"></div>
			</div>
		</div>
		<script>
			angular.module('app',[])
			.controller('ctrl',function($templateCache){
				let tmp = '<h3>555</h3>';
				$templateCache.put('fkit.html',tmp);
			});
		</script>
		<script type="text/ng-template" id="yeeku.html" >
			<h3>作者介绍</h3>
		</script>
	</body>

自定义服务
和指令一样,服务也可以根据自己的需求自定义封装服务
一般有两种方式:
1.使用angular.Module对象的方法创建服务,该对象提供了factory()、service()、provider()三个方法用于创建服务,这三个方法略有差别
2.使用$provide服务的方法创建服务,该服务同样提供前面三种方法用于创建服务,但使用较少

<body ng-app="app">
		<div ng-controller="ctrl">
			用户名:<input type="text" name="user.name" ng-model="name" /><br>
			{{reversedName}}<br>
			$fkService.name:{{serviceName}}<br>
			$fkService.age:{{serviceAge}}<br>
		</div>
		<script>
			var app=angular.module('app',[])
			    .factory('$fkService',function(){
					let service ={ } ;
					service.name = "yeeku";
					let age;
					service.setAge = function(newAge){
						age = newAge;
					}
					service.getAge = function(){
						return age;
					}
					service.reverse = function(str){
						str = str +'';
						 let result ='';
						 for(let i = str.length-1;i>=0;i--){
							 result +=str.charAt(i);
						 }
						 return result;
					}
					return service;
				});
				app.controller('ctrl',function($scope,$fkService){
					$scope.serviceName = $fkService.name;
					$fkService.age = 29;
					$scope.serviceAge = $fkService.age ;
					$scope.$watch("name",function(newVal,oldVal,scope){
						scope.reversedName = $fkService.reverse(newVal);
					});
				});
		</script>
	</body>

还可以使用service()方法创建自定义服务

	<body ng-app="app">
		<div ng-controller="ctrl">
			
				用户名:<input type="text" name="user.name" ng-model="name" /><br>
				{{reversedName}}<br>
				$fkService.name:{{serviceName}}<br>
				$fkService.age:{{serviceAge}}<br>
			
		</div>
		<script>
			var app=angular.module('app',[])
			.service("$fkService",function(){
				this.name = 'xx';
				this.setAge=function(newAge){
					this.age = newAge;
				}
				this.getAge = function(){
					return this.age;
				}
				this.reverse = function(str){
					str = str + '';
					let result ='';
					for (let i=str.length-1;i>=0;i--){
						result +=str.charAt(i);
					}
					return result;
					
				}
			});
			app.controller("ctrl",function($scope,$fkService){
				$scope.serviceName = $fkService.name;
				$fkService.age = 29;
				$scope.serviceAge = $fkService.age;
				$scope.$watch("name",function(newVal,oldVal,scope){
					$scope.reversedName = $fkService.reverse(newVal);
				});
			})
		</script>
	</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值