AngularJS入门教程之更多模板详解


Posted in Javascript onAugust 19, 2016

在这一步,你将实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来。

请重置工作目录:

git checkout -f step-8

现在当你点击列表中的一部手机之后,这部手机的详细信息页面就会被显示出来。

为了实现手机详细信息视图我们将会使用$http来获取数据,同时我们也要增添一个phone-detail.html视图模板。

步骤7和步骤8之间最重要的不同在下面列出。你可以在GitHub里看到完整的差别。

数据

除了phones.json,app/phones/目录也包含了每一部手机信息的json文件。

app/phones/nexus-s.json(样例片段)

{
 "additionalFeatures": "Contour Display, Near Field Communications (NFC),...",
 "android": {
   "os": "Android 2.3",
   "ui": "Android"
 },
 ...
 "images": [
   "img/phones/nexus-s.0.jpg",
   "img/phones/nexus-s.1.jpg",
   "img/phones/nexus-s.2.jpg",
   "img/phones/nexus-s.3.jpg"
 ],
 "storage": {
   "flash": "16384MB",
   "ram": "512MB"
 }
}

这些文件中的每一个都用相同的数据结构描述了一部手机的不同属性。我们会在手机详细信息视图中显示这些数据。

控制器

我们使用$http服务获取数据,以此来拓展我们的PhoneListCtrl。这和之前的手机列表控制器的工作方式是一样的。

app/js/controllers.js

function PhoneDetailCtrl($scope, $routeParams, $http) {
 $http.get('phones/' + $routeParams.phoneId + '.json').success(function(data) {
  $scope.phone = data;
 });
}

//PhoneDetailCtrl.$inject = ['$scope', '$routeParams', '$http'];

为了构造HTTP请求的URL,我们需要$route服务提供的当前路由中抽取$routeParams.phoneId。

模板

phone-detail.html文件中原有的TBD占位行已经被列表和构成手机详细信息的绑定替换掉了。注意到,这里我们使用AngularJS的{{表达式}}标记和ngRepeat来在视图中渲染数据模型。

app/partials/phone-detail.html

<img ng-src="{{phone.images[0]}}" class="phone">

<h1>{{phone.name}}</h1>

<p>{{phone.description}}</p>

<ul class="phone-thumbs">
 <li ng-repeat="img in phone.images">
  <img ng-src="{{img}}">
 </li>
</ul>

<ul class="specs">
 <li>
  <span>Availability and Networks</span>
  <dl>
   <dt>Availability</dt>
   <dd ng-repeat="availability in phone.availability">{{availability}}</dd>
  </dl>
 </li>
  ...
 </li>
  <span>Additional Features</span>
  <dd>{{phone.additionalFeatures}}</dd>
 </li>
</ul>

测试

我们来写一个新的单元测试,这个测试和我们在步骤5中为PhoneListCtrl写的那个很像。

test/unit/controllersSpec.js

...
 describe('PhoneDetailCtrl', function(){
  var scope, $httpBackend, ctrl;

  beforeEach(inject(function(_$httpBackend_, $rootScope, $routeParams, $controller) {
   $httpBackend = _$httpBackend_;
   $httpBackend.expectGET('phones/xyz.json').respond({name:'phone xyz'});

   $routeParams.phoneId = 'xyz';
   scope = $rootScope.$new();
   ctrl = $controller(PhoneDetailCtrl, {$scope: scope});
  }));


  it('should fetch phone detail', function() {
   expect(scope.phone).toBeUndefined();
   $httpBackend.flush();

   expect(scope.phone).toEqual({name:'phone xyz'});
  });
 });
...

执行./scripts/test.sh脚本来执行测试,你应该会看到如下输出:

Chrome: Runner reset.
...
Total 3 tests (Passed: 3; Fails: 0; Errors: 0) (5.00 ms)
 Chrome 19.0.1084.36 Mac OS: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (5.00 ms)

同时,我们也添加一个端到端测试,指向Nexus S手机详细信息页面并且验证页面的头部是“Nexus S”。

test/e2e/scenarios.js

...
 describe('Phone detail view', function() {

  beforeEach(function() {
   browser().navigateTo('../../app/index.html#/phones/nexus-s');
  });


  it('should display nexus-s page', function() {
   expect(binding('phone.name')).toBe('Nexus S');
  });
 });
...

你现在可以刷新你的浏览器,然后重新跑一遍端到端测试,或者你可以在AngularJS的服务器上运行一下。

练习

使用AngularJS端到端测试API写一个测试,用它来验证我们在Nexus S详细信息页面显示的四个缩略图。

总结

现在手机详细页面已经就绪了,在步骤9中我们将学习如何写一个显示过滤器。

以上就是整理AngularJS更多模版的资料,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
window.open()弹出居中的窗口
Feb 01 Javascript
jquery和javascript的区别(常用方法比较)
Jul 04 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
React BootStrap用户体验框架快速上手
Mar 06 Javascript
AngularJS实现的base64编码与解码功能示例
May 17 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
js拖动滑块和点击水波纹效果实例代码
Oct 16 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
Nov 07 Javascript
JS使用正则表达式提交页面验证的代码
Oct 16 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 #Javascript
JS获取当前页面名称的简单实例
Aug 19 #Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 #Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 #Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 #Javascript
AngularJS入门教程之路由与多视图详解
Aug 19 #Javascript
AngularJS入门教程之链接与图片模板详解
Aug 19 #Javascript
You might like
PHP 单引号与双引号的区别
2009/11/24 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
理解javascript正则表达式
2016/03/08 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
iView框架问题整理小结
2018/10/16 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
python中的列表与元组的使用
2019/08/08 Python
python selenium循环登陆网站的实现
2019/11/04 Python
python将数组n等分的实例
2019/12/02 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
python 获取字典键值对的实现
2020/11/12 Python
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
简单的JAVA编程面试题
2013/03/19 面试题
群众路线个人剖析材料
2014/10/07 职场文书
2014年法院工作总结
2014/11/24 职场文书
新闻通讯稿范文
2015/07/22 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python