【一起学AngularJS】第七章、XHRs和依赖注入
之前几章中,我们使用的3个手机数据集都是硬编码的。下面让我们使用Angular自带的一个叫 git checkout -f step-5
刷新浏览器查看效果。也可以点这里在线看效果。 数据项目文件中的 [
{
"age": 13,"id": "motorola-defy-with-motoblur","name": "Motorola DEFYu2122 with MOTOBLURu2122","snippet": "Are you ready for everything life throws your way?"
...
},...
]
控制器我们将使用Angular的 var phonecatApp = angular.module('phonecatApp',[]);
phonecatApp.controller('PhoneListCtrl',function ($scope,$http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
});
phonecatApp.controller('PhoneListCtrl',function ($scope,$http) {...}
通过上述代码,Angular在构造控制器时同时会为你的控制器提供以下这些服务( $前缀命名公约你可以创建自己定制的服务,我们再第十三章中也会教大家去做。Angular有一个服务命名公约,对于Angular自带的服务,我们一般使用 最小化JS时的注意事项由于Angular是根据控制器构造函数的入参来加载控制器所依赖的对象的,所以你一旦对JS代码进行了最小化(注解:应该就是所谓的JS压缩),函数的参数也会被最小化(注解:JS压缩一般会把长变量使用简单字母来替换,从而缩小JS代码),这样一来,Angular就无法正确加载对应的依赖了。 function PhoneListCtrl($scope,$http) {...}
PhoneListCtrl.$inject = ['$scope','$http'];
phonecatApp.controller('PhoneListCtrl',PhoneListCtrl);
function PhoneListCtrl($scope,$http) {...}
phonecatApp.controller('PhoneListCtrl',['$scope','$http',PhoneListCtrl]);
上述两种方案对于任何能被Angular注入的函数都适用,所以使用那种方法完全取决于你项目的风格。 phonecatApp.controller('PhoneListCtrl',function($scope,$http) {...}]);
对应本例中的代码: var phonecatApp = angular.module('phonecatApp',$http) {
$http.get('phones/phones.json').success(function(data) {
$scope.phones = data;
});
$scope.orderProp = 'age';
}]);
测试见 describe('PhoneCat controllers',function() {
describe('PhoneListCtrl',function(){
var scope,ctrl,$httpBackend;
// Load our app module definition before each test.
beforeEach(module('phonecatApp'));
// The injector ignores leading and trailing underscores here (i.e. _$httpBackend_).
// This allows us to inject a service but then attach it to a variable
// with the same name as the service in order to avoid a name conflict.
beforeEach(inject(function(_$httpBackend_,$rootScope,$controller) {
$httpBackend = _$httpBackend_;
$httpBackend.expectGET('phones/phones.json').
respond([{name: 'Nexus S'},{name: 'Motorola DROID'}]);
scope = $rootScope.$new();
ctrl = $controller('PhoneListCtrl',{$scope: scope});
}));
我们在测试中是这样创建控制器的: 因为我们的控制器代码使用了 在该测试用例中,收到HTTP回复之前,我们断言 it('should create "phones" model with 2 phones fetched from xhr',function() { expect(scope.phones).toBeUndefined(); $httpBackend.flush(); expect(scope.phones).toEqual([{name: 'Nexus S'},{name: 'Motorola DROID'}]); });
最后我们再看看orderProp的默认值是否设置正确了: it('should set the default value of orderProp model',function() { expect(scope.orderProp).toBe('age'); });
你将可以在Karma的终端输出中看到以下信息: Chrome 22.0: Executed 2 of 2 SUCCESS (0.028 secs / 0.007 secs)
实验在 <pre>{{phones | filter:query | orderBy:orderProp | json}}</pre>
这个绑定用来查看JSON格式的手机信息列表。 $scope.phones = data.splice(0,5);
总结现在你已经了解了使用Angular的服务是多么的简单(谢谢Angular的依赖注入)。下一章我们将添加为手机添加一些缩略图以及链接。 博客原文http://www.tbwood.cn/articles/2016/03/11/1457675255432.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |