今天先針對 AngularJS 入門教學 - ngRepeat (一) 有提過的過濾器(Filters) filter 來進行更進一步的說明!
filter
可以將陣列中的元素進行過濾篩選,並回傳一個新的結果陣列。
因為接下來會提到跟搜尋、排序有關的過濾器(Filters),所以筆者先行準備了一個新的 friends 陣列(js/controller.js):
1 2 3 4 5 6 7 8 9 10 11 | $scope.friends = [{ name: '男丁格爾', age: 18, skills: ['jQuery', 'JavaScript', 'Angular.js'] } // 略... , { name: '布魯克', age: 90, skills: ['催眠曲·輪舞', '鼻唄三丁·矢筈斬', '冰凍劍', '哼歌·吹雪斬'] }]; |
然後準備一個 Table 來放置這些內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <div class="span7" style="margin-top:20px;" ng-controller="TableFilterCtrl"> <div> <label>Search:</label> <input type="text" ng-model="search"> </div> <table class="table table-striped table-bordered"> <thead> <tr> <td>編號</td> <td>名稱</td> <td>年齡</td> <td>專長</td> </tr> </thead> <tbody> <tr ng-repeat="friend in friends | filter:search"> <td>{{ $index + 1 }}</td> <td>{{ friend.name }}</td> <td>{{ friend.age }}</td> <td>{{ friend.skills.join(', ') }}</td> </tr> </tbody> </table> </div> |
這邊用 ng-repeat 來將 friends 陣列的物件一一展開並產生成 tr 內容,同時還加入一個可以用來進行模糊搜尋的輸入方塊。
當 search 一旦有值輸入了,那麼表格中的內容就會自動的進行過濾篩選:
不過預設是模糊搜尋,若是想指定過濾的屬性的話,那有辦法嗎?這...當然是有的啊!讓我們再新增兩個輸入方塊:
1 2 3 4 5 | <label>Name:</label> <input type="text" ng-model="search.name"> <label>Skills:</label> <input type="text" ng-model="search.skills"> |
仔細看好囉,筆者在這兩個輸入方塊除了都加上一樣叫 search 的 model 之外,然後還在其後面多加個 .屬性。這樣我們的 search 就會被擴充進階的過濾功能了:
但有沒有發現原本的輸入方塊就變成是 [object Object] 了呢?這也是因為雙向資料綁定(Two-way data-binding)的關係。為了讓它不要直接大喇喇的顯示這樣的內容出來,且也要能一樣有無差別過濾功能,所以我們得將 ng-model 修改成:
1 | <input type="text" ng-model="search.$"> |
看吧~沒問題了:
除了能模糊搜尋之外,其實也能再增加一個參數來決定是不是要完全一模一樣才顯示出來。
1 | <label>Equality:<input type="checkbox" ng-model="strict"></label> |
接著再將 strict 加到 filter 的後面:
1 | <tr ng-repeat="friend in friends | filter:search:strict"> |
原本上面只輸入個"布"就能篩選出兩筆資料,現在只要有勾選的話,就會變成完全沒有畫面囉,再取消勾選就又能模糊查詢了:
如果想在 JavaScript 中使用 filter 的話,也請記得先在建立 Controller 時多傳入 $filter:
1 2 | // true 是指要完全一模一樣才行 $filter('filter')($scope.friends, $scope.search, true) |
今天這個範例請各位要好好的實際練習一下,因為接下來的 limitTo 及 orderBy 等過濾器在某種程度上是有一定的關係的喔!
hi 老師
想請問一下 如果想要多筆搜尋
如在輸入框打入 aaa | bbb
讓ng-repeat內的資料就過濾出 aaa 與 bbb 這種
原本用 Jquery 寫了些過濾器
但是轉到angular之後不知道怎麼實行
能給點提示嗎
你可以自訂一個濾器來處理你想要的篩選。
可以先參考 AngularJS 入門教學 - 自訂過濾器