在这一步骤中,将学习到如何定制一个显示转换器 *在前一步,详细说明页面直接用"true"和"false"来显示某个手机特性是否被支持,在这里,我们将定制一个转换器,实现用符号:✓ 对应 "true", 以及 ✘ 对应 "false",来进行显示。让我们看看转换器的代码是怎么样的。
直接用浏览器访问步骤9在线演示
大多数的重要改变都会列在下面,不过你也可以在GitHub看到完整的差异。
为了创建一个新的转换器,你需要创建一个phonecatFilters
模块并把定制的转换器注册到这个模块中。
app/js/filters.js
:
angular.module('phonecatFilters', []).filter('checkmark', function() {
return function(input) {
return input ? '\u2713' : '\u2718';
};
});
我们要定制的转换器叫做"checkmark"。其输入(input
)是true
或者false
,返回的输出结果根据输入是 true
(\u2713 -> ✓) 或者false
(\u2718 -> ✘)。
现在我们的转换器已经准备好了,需要注册到phonecatFilters
模块中,并成为我们主模块phonecatApp
的一个依赖。
app/js/app.js
:
...
angular.module('phonecatApp', ['ngRoute','phonecatControllers','phonecatFilters']);
...
因为转换器的代码存在于app/js/filters.js
文件中,所以我们需要把它添加到布局模板中。
app/index.html
:
...
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
...
在Angular模板中采用如下的语法来应用转换器:
{{ expression | filter }}
让我们把这个转换器应用到手机详细说明模板中:
app/partials/phone-detail.html
:
...
<dl>
<dt>Infrared</dt>
<dd>{{phone.connectivity.infrared | checkmark}}</dd>
<dt>GPS</dt>
<dd>{{phone.connectivity.gps | checkmark}}</dd>
</dl>
...
转换器就像其它组件一样,也需要被测试,而且其测试也很容易写。
test/unit/filtersSpec.js
:
describe('filter', function() {
beforeEach(module('phonecatFilters'));
describe('checkmark', function() {
it('should convert boolean values to unicode checkmark or cross',
inject(function(checkmarkFilter) {
expect(checkmarkFilter(true)).toBe('\u2713');
expect(checkmarkFilter(false)).toBe('\u2718');
}));
});
});
我们在进行任何转换器测试前要保证调用了`beforeEach(module('phonecatFilters'))`,通过这个调用来加载`phonecatFilters`模块并注入测试中来保证测试用例能够正确初始化(被注入)。
注意我们还调用了辅助功能函数`inject(function(checkmarkFilter) { ... })`来访问我们打算测试的转换器,具体函数功能查看`angular.mock.inject()`。
注意注入后,一个后缀"Filter"会被添加到转换器名称后。请查看“Filter Guide ”的相关部分来了解更多。
你现在可以看到类似如下的Karma输出:
```cmd
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
:
<input ng-model="userInput"> Uppercased: {{ userInput | uppercase }}
现在我们已经学习了如何写一个定制转换器,并知道如何进行测试,让我们进入步骤10学习如何使用Angular来增强手机详细说明页面。