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 相关文章推荐
基于jquery的固定表头和列头的代码
May 03 Javascript
Node.js编码规范
Jul 14 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 Javascript
javascript中获取元素标签中间的内容的实现方法
Oct 08 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
Nov 09 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
vue项目首屏加载时间优化实战
Apr 23 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
Sep 16 Javascript
使用JS location实现搜索框历史记录功能
Dec 23 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 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中in_array函数用法分析
2014/11/15 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
php里array_work用法实例分析
2015/07/13 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
vue组件实现进度条效果
2018/06/06 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python代理抓取并验证使用多线程实现
2013/05/03 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
python实现堆排序的实例讲解
2020/02/21 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
keras.layer.input()用法说明
2020/06/16 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
涉外文秘个人求职的自我评价
2013/10/07 职场文书
师范生个人推荐信
2013/11/29 职场文书
2014春晚主持词
2014/03/25 职场文书
贷款担保书范文
2014/05/13 职场文书
完美的中文自荐信
2014/05/24 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
《窃读记》教学反思
2016/02/18 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电