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 checkbox(复选框) 使用集锦
Apr 28 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
Angular 中 select指令用法详解
Sep 29 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
关于Iframe父页面与子页面之间的相互调用
Nov 22 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
Jul 13 Javascript
VueCli3构建TS项目的方法步骤
Nov 07 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
vue开发简单上传图片功能
Jun 30 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
详解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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
浅析php单例模式
2014/11/25 PHP
基于PHP制作验证码
2016/10/12 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
详解javascript高级定时器
2015/12/31 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
Python 基础知识之字符串处理
2017/01/06 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
浅析python中while循环和for循环
2019/11/19 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
自荐信怎么写好
2013/11/11 职场文书
项目专员岗位职责
2013/12/04 职场文书