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 获取元素下面所有li的两种方法
Apr 14 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
Angularjs中使用Filters详解
Mar 11 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
vue-dialog的弹出层组件
May 25 Javascript
Vue组件库发布到npm详解
Feb 17 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
js中对象和面向对象与Json介绍
Jan 21 Javascript
vue滚动插件better-scroll使用详解
Oct 18 Javascript
node使用async_hooks模块进行请求追踪
Jan 28 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
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
Python如何快速实现分布式任务
2017/07/06 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python 操作hive pyhs2方式
2019/12/21 Python
中药学自荐信
2014/06/15 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
工作保证书怎么写
2015/02/28 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技