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 相关文章推荐
js 浮动层菜单收藏
Jan 16 Javascript
javascript new 需不需要继续使用
Jul 02 Javascript
JQuery加载图片自适应固定大小的DIV
Sep 12 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
javascript数据类型验证方法
Dec 31 Javascript
微信小程序 实战小程序实例
Oct 08 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
Mar 08 Javascript
js+html实现周岁年龄计算器
Jun 25 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 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
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
js切换光标示例代码
2013/10/10 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
python元组操作实例解析
2014/09/23 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
详解Django通用视图中的函数包装
2015/07/21 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
银行转正自我鉴定
2014/09/29 职场文书
关于感谢信的范文
2015/01/23 职场文书
2015年安全生产责任书
2015/01/30 职场文书
项目负责人岗位职责
2015/02/15 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电