步骤9——转换器

在这一步骤中,将学习到如何定制一个显示转换器 *在前一步,详细说明页面直接用”true”和”false”来显示某个手机特性是否被支持,在这里,我们将定制一个转换器,实现用符号:✓ 对应 “true”, 以及 ✘ 对应 “false”,来进行显示。让我们看看转换器的代码是怎么样的。

工作区切换到步骤9

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

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

定制转换器

为了创建一个新的转换器,你需要创建一个phonecatFilters模块并把定制的转换器注册到这个模块中。 app/js/filters.js:

  1. angular.module('phonecatFilters', []).filter('checkmark', function() {
  2. return function(input) {
  3. return input ? '\u2713' : '\u2718';
  4. };
  5. });

我们要定制的转换器叫做”checkmark”。其输入(input)是true或者false,返回的输出结果根据输入是 true (\u2713 -> ✓) 或者false (\u2718 -> ✘)。

现在我们的转换器已经准备好了,需要注册到phonecatFilters模块中,并成为我们主模块phonecatApp的一个依赖。

app/js/app.js:

  1. ...
  2. angular.module('phonecatApp', ['ngRoute','phonecatControllers','phonecatFilters']);
  3. ...

模板

因为转换器的代码存在于app/js/filters.js文件中,所以我们需要把它添加到布局模板中。 app/index.html:

  1. ...
  2. <script src="js/controllers.js"></script>
  3. <script src="js/filters.js"></script>
  4. ...

在Angular模板中采用如下的语法来应用转换器:

  1. {{ expression | filter }}

让我们把这个转换器应用到手机详细说明模板中: app/partials/phone-detail.html:

  1. ...
  2. <dl>
  3. <dt>Infrared</dt>
  4. <dd>{{phone.connectivity.infrared | checkmark}}</dd>
  5. <dt>GPS</dt>
  6. <dd>{{phone.connectivity.gps | checkmark}}</dd>
  7. </dl>
  8. ...

测试

转换器就像其它组件一样,也需要被测试,而且其测试也很容易写。 test/unit/filtersSpec.js:

  1. describe('filter', function() {
  2. beforeEach(module('phonecatFilters'));
  3. describe('checkmark', function() {
  4. it('should convert boolean values to unicode checkmark or cross',
  5. inject(function(checkmarkFilter) {
  6. expect(checkmarkFilter(true)).toBe('\u2713');
  7. expect(checkmarkFilter(false)).toBe('\u2718');
  8. }));
  9. });
  10. });

我们在进行任何转换器测试前要保证调用了beforeEach(module('phonecatFilters')),通过这个调用来加载phonecatFilters模块并注入测试中来保证测试用例能够正确初始化(被注入)。

注意我们还调用了辅助功能函数inject(function(checkmarkFilter) { ... })来访问我们打算测试的转换器,具体函数功能查看angular.mock.inject()

注意注入后,一个后缀”Filter”会被添加到转换器名称后。请查看“Filter Guide ”的相关部分来了解更多。

你现在可以看到类似如下的Karma输出:

  1. Chrome 22.0: Executed 4 of 4 SUCCESS (0.034 secs / 0.012 secs)

尝试

让我们尝试一些Angular内建的转换器,把这些添加绑定到index.html:

  • {{"lower cap string" | uppercase }}
  • {{foo : "bar",baz :23 | json }}
  • {{1304375948024 | date }}
  • {{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }}

我们也创建一个输入模块,来包括这些转换器绑定,添加如下代码到index.html:

  1. <input ng-model="userInput"> Uppercased: {{ userInput | uppercase }}

小结

现在我们已经学习了如何写一个定制转换器,并知道如何进行测试,让我们进入步骤10学习如何使用Angular来增强手机详细说明页面。