angular-phonecat教程中文版

步骤6——模板链接与图形

在这一步,会为手机列表添加缩略图以及对应的购买信息链接。后续步骤中,你将通过链接显示目录中手机的更多附加(详细)信息。

  • 现在就为手机列表添加缩略图和链接。

工作区切换到步骤6

直接用浏览器访问步骤6在线演示

大多数的重要改变都会列在下面,不过你也可以在GitHub看到完整的差异。

数据

注意到在phones.json中包含了每个手机独一无二的id和图片链接地址。这些链接地址都指向app/img/phones/目录。 app/phones/phones.json(一段手机数据的快照)

[
  {
    ...
    "id": "motorola-defy-with-motoblur",
    "imageUrl": "img/phones/motorola-defy-with-motoblur.0.jpg",
    "name": "Motorola DEFY\u2122 with MOTOBLUR\u2122",
    ...
  },
  ...
]

模板

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属性的赋值中用到了由双大括号括起来的数据绑定。在步骤2中,我们把{{phone.name}}绑定到一个html元素的内容中,这一步{{phone.id}}将用来绑定到元素属性中。

我们还为每款手机添加了图片,这里用到了ngSrc命令,它会阻止浏览器在Angular还没有初始化并能够正常展开绑定时发出诸如下面一样的无效URL请求: http://localhost:8000/app/{{phone.imageUrl}},而是仅仅描述当前元素需要一个src属性,这个属性(<img src="{{phone.imageUrl}}">,会在Angular初始化好后进行绑定),使用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.split('#')[1]).toBe('/phones/nexus-s');
      });
    });
...

我们添加一个新的端到端测试来验证程序会处理正确的链接,对于这个手机显示程序来说,正是我们要实现的功能。

你现在可以运行npm run protractor来看测试情况。

尝试

ng-src指令替换为原来的src属性,使用诸如Firebug之类的工具或者Chrome浏览器的Web开发组件观察web访问日志,可以观察到如/app/%7B%7Bphone.imageUrl%7D%7D 或者 /app/{{phone.imageUrl}}这样的无效请求,这些无效请求就是浏览器在Angular还没有正确初始化和进行数据绑定(注入)时,构建img标签时发出的,这使得图片不能正确显示。

小结

我们已经给手机添加了图片和链接,让我们进入步骤7,学习如何对模板进行布局,以及Angular如何容易的创建一个多视图的程序。