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 相关文章推荐
prototype.js的Ajax对象
Sep 23 Javascript
科讯商业版中用到的ajax空间与分页函数
Sep 02 Javascript
JavaScript下申明对象的几种方法小结
Oct 02 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 Javascript
THREE.JS入门教程(3)着色器-下
Jan 24 Javascript
JavaScript中的数学运算介绍
Dec 29 Javascript
JScript中的条件注释详解
Apr 24 Javascript
JavaScript的Number对象的toString()方法
Dec 18 Javascript
AngularJS自动表单验证
Feb 01 Javascript
详解微信小程序审核不通过的解决方法
Jan 17 Javascript
VUE 实现复制内容到剪贴板的两种方法
Apr 24 Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 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
星际争霸中的热键
2020/03/04 星际争霸
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
检讨书模板
2015/01/29 职场文书
党员个人总结范文
2015/02/14 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
交通事故代理词范文
2015/05/23 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技