5-XHRs(XmlHttpRequest)与依赖注入
足以给应用绑定了硬编码数据集中的三条手机数据,让我们从我们的服务中适配更大的数据集,他使用Angular内建的 服务中 $htttp。我们将使用Angular的 依赖注入给 gitcheckout-fstep-5 刷新你的浏览器,或者在线上检出这一步:第五步例子。 大部分重要的修改都列在下面,你在 GitHub上能看全部不同。 数据
[ { "age":13,"id":"motorola-defy-with-motoblur","name":"MotorolaDEFYu2122withMOTOBLURu2122","snippet":"Areyoureadyforeverythinglifethrowsyourway?" ... },... ] 控制器我们使用Angular的 $http服务,在我们控制器中制作HTTP请求来从 varphonecatApp=angular.module('phonecatApp',[]); phonecatApp.controller('PhoneListCtrl',function($scope,$http){ $http.get('phones/phones.json').success(function(data){ $scope.phones=data; }); $scope.orderProp='age'; }); $http制造一个HTTP GET 请求去我们Web服务器,请求 phonecatApp.controller('PhoneListCtrl',$http){...} 当控制器被构建时,Angular的依赖注入器提供服务给你的控制器,依赖注入器也小心地创建服务可能有的过渡依赖(服务可能依赖其他服务)。 注意参数的名字很重要,因为注册器用他们寻找依赖。 $前缀命名规定你可以创建自己的服务,实际上我们恰好在做第11步的事,做为命名规定,Angular的内建服务,范围方法和其他一些Angular 应用接口在名字前有$前缀。 $前缀在这里是Angular提供服务的名字空间,为了防止冲突,最好是避免你的服务和模型其他东西用 注意最小化倍率当Angular从控制器构建方法的参数名字中推导控制器的依赖,如果你 压缩
两种方法都可以通过Angular给任何函数注入,所以选择那个决定于你的工程风格。 当我们使用第二种方法,常用方法是当注入控制器时在一行内提供匿名函数构建器。 phonecatApp.controller('PhoneListCtrl',$http){...}]); 从这点出发,我们将在教程中使用行内方法,用这种意图,让我们增加一个注解给我们的 varphonecatApp=angular.module('phonecatApp',$http){ $http.get('phones/phones.json').success(function(data){ $scope.phones=data; }); $scope.orderProp='age'; }]); 测试test/unit/controllersSpec.js: 因为我们开始使用依赖注入,并且我们的控制器有了依赖,构造控制器在我们测试中有一点复杂,我们使用new操作符,提供有某些假$http实现的控制器,但是 Angular提供模拟$http服务,我们能用他来做单元测试,我们配置“假”响应服务通过调用服务上的方法,服务响应。 describe('PhoneCatcontrollers',function(){ describe('PhoneListCtrl',function(){ varscope,ctrl,$httpBackend; //Loadourappmoduledefinitionbeforeeachtest. beforeEach(module('phonecatApp')); //Theinjectorignoresleadingandtrailingunderscoreshere(i.e._$httpBackend_). //Thisallowsustoinjectaservicebutthenattachittoavariable //withthesamenameastheserviceinordertoavoidanameconflict. beforeEach(inject(function(_$httpBackend_,$rootScope,$controller){ $httpBackend=_$httpBackend_; $httpBackend.expectGET('phones/phones.json'). respond([{name:'NexusS'},{name:'MotorolaDROID'}]); scope=$rootScope.$new(); ctrl=$controller('PhoneListCtrl',{$scope:scope}); })); 注意:因为在我们的测试环境中读取Jasmin和angular-mocks.js,我们用两个帮助方法 module和 inject来读取各配置注入器。 我们在测试环境中创建控制器,如下:
因为我们在控制器中使用了
现在让我们创建一个断言验证phones模型在响应接到之前不存在于scope中。 it('shouldcreate"phones"modelwith2phonesfetchedfromxhr',function(){ expect(scope.phones).toBeUndefined(); $httpBackend.flush(); expect(scope.phones).toEqual([{name:'NexusS'},{name:'MotorolaDROID'}]); });
最后,我们验证orderProp默认值设定正确。 it('shouldsetthedefaultvalueoforderPropmodel',function(){ expect(scope.orderProp).toBe('age'); }); 现在你可以在Karma选项卡中查看下面的输出。 Chrome22.0:Executed2of2SUCCESS(0.028secs/0.007secs) 实验在index.html底部,增加 $scope.phones=data.splice(0,5); 总结现在你已经学了使用Angular服务是多么容易(谢谢Angular的依赖注入),到 第6步,你将给手机增加一些缩略图和链接。 原文地址: https://docs.angularjs.org/tutorial/step_05 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |