在這一步中,你將學(xué)會(huì)如何創(chuàng)建你自己的自定義顯示篩選器。
把工作空間重置到第九步
git checkout -f step-9
刷新你的瀏覽器或在線檢查這一步:Step 9 Live Demo
下面列出了第八步和第九步之間最重要的區(qū)別。你可以在GitHub上看到完整的差異。
為了創(chuàng)建一個(gè)新篩選器,你即將創(chuàng)建一個(gè)phonecatFilters模塊,并用這個(gè)模塊注冊(cè)你的自定義濾鏡:
app/js/filters.js:
angular.module('phonecatFilters', []).filter('checkmark', function() {
return function(input) {
return input ? '\u2713' : '\u2718';
};
});
我們的篩選器的名字是“checkmark”。input要么估值為true,要么估值為false,而且會(huì)返回我們選中用來代表true和false的兩個(gè)unicode字符之一(\u2713->?代表true,\u2718 -> ?代表false)。
現(xiàn)在我們的篩選器已經(jīng)準(zhǔn)備好了,我們需要注冊(cè)phonecatFilters模塊作為我們的主phonecatApp模塊的依賴性。
app/js/app.js:
...
angular.module('phonecatApp', ['ngRoute','phonecatControllers','phonecatFilters']);
...
因?yàn)楹Y選器生存在app/js/filters.js文件夾中,我們需要在我們的布局模板中包含這個(gè)文件。
app/index.html:
...
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
...
在Angular模板中使用篩選器的句法如下所示:
{{ expression | filter }}
讓我們?cè)谑謾C(jī)詳情模板中采用這個(gè)篩選器:
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>
...
篩選器,就像任何別的組件,必須被測(cè)試,而且寫這些測(cè)試很容易。
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');
}));
});
});
我們必須在執(zhí)行任何篩選器測(cè)試之前調(diào)用beforeEach(module('phonecatFilters'))。這種調(diào)用把我們的phonecatFilter模塊載入到注入器,以測(cè)試運(yùn)行。
注意我們將調(diào)用助手函數(shù)inject(function(checkmarkFilter) { ... }),從而獲得訪問我們想要測(cè)試的文件。參見angular.mock.inject()。
注意在注入的時(shí)候,后綴Filter會(huì)追加到你的篩選器名稱中。參見篩選器指南?部分,在那里是概述。
你現(xiàn)在必須在Karma選項(xiàng)卡中看到以下的輸出:
Chrome 22.0: Executed 4 of 4 SUCCESS (0.034 secs / 0.012 secs)
讓我們用一些內(nèi)建的Angular篩選器來做實(shí)驗(yàn),并把以下綁定添加到index.html:
{{ "lower cap string" | uppercase }}{{ {foo: "bar", baz: 23} | json }}{{ 1304375948024 | date }}{{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }}我們可以創(chuàng)建一個(gè)模塊,帶有一個(gè)輸入元素,并把它與一個(gè)篩選綁定結(jié)合起來。向index.html添加以下代碼:
<input ng-model="userInput"> Uppercased: {{ userInput | uppercase }}
現(xiàn)在你已經(jīng)學(xué)會(huì)了如何編寫并測(cè)試一個(gè)自定義篩選器,前往第十步 事件處理函數(shù)以學(xué)習(xí)我們可以如何用Angular繼續(xù)豐富手機(jī)詳情頁(yè)面。