在使用 AngularJS 的过程中会遇到一些特殊的数据处理,你可以通过采用 AngularJS 筛选器的方式来对不同的数据处理实现想要达到的效果。
在这一步中,你将学会如何创建你自己的自定义显示筛选器。
把工作空间重置到第九步
git checkout -f step-9刷新你的浏览器或在线检查这一步:Step 9 Live Demo
下面列出了第八步和第九步之间最重要的区别。你可以在GitHub上看到完整的差异。
为了创建一个新筛选器,你即将创建一个phonecatFilters模块,并用这个模块注册你的自定义滤镜:
app/js/filters.js:
angular.module('phonecatFilters', []).filter('checkmark', function() {
return function(input) {
return input ? '\u2713' : '\u2718';
};
});我们的筛选器的名字是“checkmark”。input要么估值为true,要么估值为false,而且会返回我们选中用来代表true和false的两个unicode字符之一(\u2713->?代表true,\u2718 -> ?代表false)。
现在我们的筛选器已经准备好了,我们需要注册phonecatFilters模块作为我们的主phonecatApp模块的依赖性。
app/js/app.js:
...
angular.module('phonecatApp', ['ngRoute','phonecatControllers','phonecatFilters']);
...因为筛选器生存在app/js/filters.js文件夹中,我们需要在我们的布局模板中包含这个文件。
app/index.html:
...
<script src="/attachments/image/wk/angularjs/controllers.js"></script>
<script src="/attachments/image/wk/angularjs/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'))。这种调用把我们的phonecatFilter模块载入到注入器,以测试运行。
注意我们将调用助手函数inject(function(checkmarkFilter) { ... }),从而获得访问我们想要测试的文件。参见angular.mock.inject()。
注意在注入的时候,后缀Filter会追加到你的筛选器名称中。参见筛选器指南?部分,在那里是概述。
你现在必须在Karma选项卡中看到以下的输出:
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 }}现在你已经学会了如何编写并测试一个自定义筛选器,前往第十步 事件处理函数以学习我们可以如何用Angular继续丰富手机详情页面。