在这一步中,你将为手机列表中的手机添加一个缩略图,并链接到想去的地方。在后续的步骤中,你将使用这个链接显示关于目录中的这款手机的额外的信息。
把工作空间重置到第六步
git checkout -f step-6
刷新你的浏览器或在线检查这一步:Step 6 Live Demo
下面列出了第五步和第六步之间的最重要的区别。你可以在GitHub里看到完整的差异。
注意,phones.json
文件包含了针对每款手机的独一无二的ID和图像URL。URL指向app/img/phones
目录。
app/phones/phones.json
(示例片段):
[
{
...
"id": "motorola-defy-with-motoblur",
"imageUrl": "img/phones/motorola-defy-with-motoblur.0.jpg",
"name": "Motorola DEFYu2122 with MOTOBLURu2122",
...
},
...
]
app/index.html
:
...
<ul class="phones">
<li ng-repeat="phone in phones | filter:query | orderBy:orderProp" class="thumbnail">
<a href="#/phones/{{phone.id}}" class="thumb"><img ng-src="{{phone.imageUrl}}"></a>
<a href="#/phones/{{phone.id}}">{{phone.name}}</a>
<p>{{phone.snippet}}</p>
</li>
</ul>
...
要想未来动态生成指向手机详情页的链接,我们在元素属性href
的值上使用了广为人知的双花括号绑定。在第二步中,我们添加了{{phone.name}}
绑定,作为元素内容。在这一步中,{{phone.id}}
绑定用在元素属性上。
我们还在每条记录后面添加了手机图像,用一个带ngSrc指令的图像标签。这个指令防止浏览器字面理解Anglar标签{{ expression }}
、向无效的URLhttp://localhost:8000/app/{{phone.imageUrl}}
初始化一个请求,如果我们只在一个常规的元素属性src
上绑定这个双花括号值(<img src="{{phone.imageUrl}}">
),这样的事情真的会发生。使用ngSrc
指令以防止浏览器对一个无效的位置发起http请求。
test/e2e/scenarios.js
:
...
it("should render phone specific links", function() {
var query = element(by.model("query"));
query.sendKeys("nexus");
element.all(by.css(".phones li a")).first().click();
browser.getLocationAbsUrl().then(function(url) {
expect(url).toBe("/phones/nexus-s");
});
});
...
我们添加了一个新的端到端测试,以核查应用是否生成了正确的链接,正确的链接要链到手机视图中,我们将在下一步是实现这个视图。
现在你可以重新运行npm run protractor
以查看测试运行。
用扁平的旧元素属性src
代替ng-src
指令。使用一些工具,比如说Firebug,或者Chrome的Web Inspector,或者检查web服务器的访问日志,确保应用确实发起过了一个外部请求,指向/app/%7B%7Bphone.imageUrl%7D%7D
(或者/app/{{phone.imageUrl}}
)。
有个话题是,在Angular已经有机会评估表达式、并注入有效地址之前,当浏览器读取img
标签时,浏览器将向非法的图像地址发起一个请求。
现在你已经添加了一个手机图像和链接,前往第七步 路由与多视图以学习关于Angular布局模板、以及Angular如何使创建具有多个视图的应用变容易。
AngularJS 服务(Service)AngularJS 中的服务是一个函数或对象。AngularJS 中你可以创建自己的服务,或使用内建服务。什么是服务...
Vue CLI 项目天生支持PostCSS、CSS Modules和包含Sass、Less、Stylus在内的预处理器。引用静态资源所有编译后的 CSS 都会通过css...
构造器每个 Vue.js 应用都是通过构造函数Vue创建一个Vue 的根实例启动的:var vm = new Vue({// 选项})虽然没有完全遵循MVVM 模...
ReactReact 和 Vue 有许多相似之处,它们都有:使用 Virtual DOM提供了响应式(Reactive)和组件化(Composable)的视图组件。将...
稳定性: 3 - 稳定net模块提供了异步网络封装,该Node.js模块包含了创建服务器/客户端的方法(调用 streams),你可以通过调用req...
Node.js Addons(插件)是动态链接的共享对象。他提供了C/C++类库能力。这些API比较复杂,他包以下几个类库:V8 JavaScript, C++...
使用枚举我们可以定义一些有名字的数字常量。 枚举通过enum关键字来定义。enum Direction {Up = 1,Down,Left,Right}一个枚举类型...
关于术语的一点说明:请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块...
1. 二进制和八进制表示法ES6 提供了二进制和八进制数值的新的写法,分别用前缀 0b (或 0B )和 0o (或 0O )表示。0b111110111...