AngularJS中使用service,并同步数据
2016-09-20 17:37
239 查看
service是单例对象,在应用中不同代码块之间共享数据。
对一些公用的方法封装到service中,然后通过依赖注入在Controller中调用,示例代码:
1.创建一个模块:
2.创建一个service服务:
3.在Controller中调用:
但是,当涉及到异步请求的时候,service的数据就可能会在controller调用的时候不同步,比如:
定义一个service,用来请求json数据:
在controller中调用:
这时候,控制台打印显示:data有数据,但是s为undefined。
具体原因我没去深究,大概猜测是异步请求数据的原因,因为第二次调用getCapt方法的时候s有数据了,所以通过内置服务$q来进行数据的同步调用:
service这样写:
controller这样调用:
如此实现了数据同步调用。
对一些公用的方法封装到service中,然后通过依赖注入在Controller中调用,示例代码:
1.创建一个模块:
var module = angular.module( "my.new.module", [] );
2.创建一个service服务:
module.service( 'Book', [ '$rootScope', function( $rootScope ) { var service = { books: [ { title: "Magician", author: "Raymond E. Feist" }, { title: "The Hobbit", author: "J.R.R Tolkien" } ], addBook: function ( book ) { service.books.push( book ); $rootScope.$broadcast( 'books.update' ); } } return service; }]);
3.在Controller中调用:
1 var ctrl = [ '$scope', 'Book', function( scope, Book ) { 2 scope.$on( 'books.update', function( event ) { 3 scope.books = Book.books; 4 scope.$apply(); 5 }); 6 scope.books = Book.books; 7 }]; 8 9 module.controller( "books.list", ctrl );
但是,当涉及到异步请求的时候,service的数据就可能会在controller调用的时候不同步,比如:
定义一个service,用来请求json数据:
1 module.service('VService',['$http',function($http){ 2 var service={ 3 getCode:function(mobile){ 4 var msg={}; $http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){ 5 console.log("data=="+JSON.stringify(data)); 6 msg=data; 7 }); 9 return msg; 10 } 12 } 13 14 return service; 15 }]);
在controller中调用:
module.controller("myCtrl",["$scope",$routeParams","VService",function($scope,$http,$routeParams,VService){ $scope.mobile=$routeParams.mobile; $scope.getCapt = function(){ var s=VService.getCode($scope.mobile); console.log(s); }; }]);
这时候,控制台打印显示:data有数据,但是s为undefined。
具体原因我没去深究,大概猜测是异步请求数据的原因,因为第二次调用getCapt方法的时候s有数据了,所以通过内置服务$q来进行数据的同步调用:
service这样写:
var service={ getCode:function(mobile){ var deferred = $q.defer();//声明延后执行,表示要去监控后面的执行 $http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){ console.log("data=="+JSON.stringify(data)); deferred.resolve(data);//声明执行成功,即http请求数据成功,可以返回数据了 } ); return deferred.promise;//返回承诺,这里并不是最终数据,而是访问最终数据的API }}
controller这样调用:
VService.getCode($scope.mobile).then(function(data){ $scope.s=data; console.log("s==="+JSON.stringify($scope.s)); })
如此实现了数据同步调用。
相关文章推荐
- AngularJS中使用service,并同步数据
- 在AngularJS中使用$q同步读取服务器数据
- 使用SharedPreferences实现Activity和Service之间数据同步问题
- angularjs 中使用 service 在controller 之间 share 对象和数据
- AngularJs使用ng-model-options设置数据同步时机提高网站性能
- 在AngularJS中使用$q同步读取服务器数据
- 在AngularJS中使用$q同步读取服务器数据
- Sync Service for ADO.NET 程序调试 - 使用Tracing生成LOG(数据同步的日志) [DEVICE篇]
- Flex与.NET互操作(四):使用HttpService、URLReqeust和URLLoader加载/传输数据
- 微软同步框架(MSF)入门之五--使用WCF同步远程数据
- Flex与.NET互操作(四):使用HttpService、URLReqeust和URLLoader加载/传输数据
- 使用PLSQL Developer来实现不同数据库的表结构以及表数据同步
- 教你如何使用wifi来同步iPhone数据
- 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题
- rsync 数据同步使用详解
- 如何使用 PDI 和 Oracle CDC 来实现Oracle 数据库向其他数据库的数据同步
- Flex与.NET互操作(四):使用HttpService、URLReqeust和URLLoader加载/传输数据
- 使用 ReplicationConnection 进行 Master/Slave 间数据同步
- 针式PKM使用经验二:如何将数据同步到移动硬盘或U盘
- Oracle 快照及 dblink使用 (两台服务器数据同步)