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 相关文章推荐
javascript实现的像java、c#之类的sleep暂停的函数代码
Mar 04 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
JS复制到剪贴板示例代码
Oct 30 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
Aug 01 Javascript
获取select的value、text值的简单示例(jquery与javascript)
Dec 07 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
Dec 12 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
Dec 22 Javascript
vue发送ajax请求详解
Oct 09 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
javascrpt密码强度校验函数详解
Mar 18 Javascript
微信小程序APP的生命周期及页面的生命周期
Apr 19 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缓存函数的使用说明
2013/05/10 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
javascript canvas封装动态时钟
2020/09/30 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
优秀民警事迹材料
2014/01/29 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
就业协议书怎么填
2014/09/15 职场文书
大学生党性分析材料
2014/12/19 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python