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 相关文章推荐
脚本收藏iframe
Jul 21 Javascript
extjs fckeditor集成代码
May 10 Javascript
javascript 框架小结 个人工作经验
Jun 13 Javascript
javascript去掉前后空格的实例
Nov 07 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
Sep 01 Javascript
assert()函数用法总结(推荐)
Jan 25 Javascript
jQuery实现淡入淡出的模态框
Feb 09 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
vue cli使用融云实现聊天功能的实例代码
Apr 19 Javascript
layer.open 获取不到表单信息的解决方法
Sep 26 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 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 Socket 编程
2010/04/09 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
PDO::prepare讲解
2019/01/29 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
django 自定义用户user模型的三种方法
2014/11/18 Python
python实现矩阵乘法的方法
2015/06/28 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
python打开使用的方法
2019/09/30 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python中的yield from语法快速学习
2020/11/06 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
先进典型事迹材料
2014/12/29 职场文书
2015最新民情日记范文
2015/06/26 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python