angularjs入門-filter

angularjs入門-filter

angularjs提供了很多filter,這個新名詞又是什麼呢?其實也就是對顯示的格式format的意思,在1.3以前,使用filter的效能會比較差,1.3之後改進很多,當然除非不得已,建議格式化輸出樣式,最好還是在後端處理完會比較好,我們可以去官網看看到底官方提供了哪些filter,https://docs.angularjs.org/api,首先來看看number,如下例子

 

image


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        {{2000000.12345 | number}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                
            });
    </script>
</body>
</html>

如果我們只要顯示小數點兩位,只要改成number:2,可以自行試試看

接著我們來看看currency,其實就是會在數字前加入$


        {{2000000.12345 | currency}}
</div>

如果我們加入了各國語系的js檔,則會自動加上各國的幣別代號,比如台灣的NT,如下所示我多加入了台灣語系的js檔

 

image


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        {{2000000.12345 | currency}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script src="Scripts/i18n/angular-locale_zh-tw.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                
            });
    </script>
</body>
</html>

或者自訂幣別格式,我想要顯示台幣兩字


        {{2000000.12345 | currency:'台幣$'}}
</div>

lowercase顧名思義就是把大寫字母轉成小寫,uppercase則是把小寫變成大寫,如下


        {{'KINANSON' | lowercase}}
        <hr />
        {{'jacky is a man' | uppercase}}
</div>

date就是日期的格式化,如下所示

 

image


    <div ng-controller="FirstCtrl">
        {{IsDate | date}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.IsDate = Date.now();
            });
    </script>
</body>

我們也可以自訂格式,date有非常多的格式化,想了解更多的話,可參考官網,https://docs.angularjs.org/api/ng/filter/date


        {{IsDate | date:'yyyy-MM-dd'}}
</div>

再來就是談談filter了,其實在ng-repeat的時候,就有先用過這個了,為此我們再把之前的範例拿出來看一下。

<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <input type="text" ng-model="msg" />
        <div ng-repeat="item in people | filter:msg">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
    </div>
    <script src="Scripts/angular.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.people = [
                    { name: 'anson', sex: 'boy' },
                    { name: 'andy', sex: 'boy' },
                    { name: 'coco', sex: 'girl' },
                    { name: 'lucky', sex: 'dog' },
                    { name: 'micky', sex: 'mouse' },
                ];
            });
    </script>
</body>

之前也有提過,如果我們想針對特別欄位搜尋,我們可以改成如下


        <input type="text" ng-model="msg.name" />
        <div ng-repeat="item in people | filter:msg">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
  </div>

再來談談limitTo,其實也就是要顯示多少筆的意思


        <div ng-repeat="item in people | limitTo:3">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
 </div>

然後是orderBy,如下


            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
</div>

要反排序的話,只要加上-,如下


        <div ng-repeat="item in people | orderBy:'-sex'">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
</div>

我們可以同時使用多個filter,比如我要只顯示三筆,又要排序,如下


        <div ng-repeat="item in people | orderBy:'-sex' | limitTo:'3'">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
</div>

 

如果要在js檔裡面寫filter的話也可以,如下例子


    <div ng-controller="FirstCtrl">
        <div ng-repeat="item in people">
            <span class="form-control change-color-{{$first}}">第{{$index}}號:我叫{{item.name}}-我是{{item.sex}}</span>
        </div>
    </div>
    <script src="Scripts/angular.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope,$filter) {
                $scope.people = [
                    { name: 'anson', sex: 'boy' },
                    { name: 'andy', sex: 'boy' },
                    { name: 'coco', sex: 'girl' },
                    { name: 'lucky', sex: 'dog' },
                    { name: 'micky', sex: 'mouse' },
                ];
                $scope.people = $filter('limitTo')($scope.people,3);
            });
    </script>
</body>

有些時候在js檔裡面寫filter其實是很有必要性的,比如像我們在使用一些第三方的日期,雖然在畫面上看起來正常,但是在js檔要寫回資料庫的時候,格式可能不如預期,我們就非常需要在後端格式化,然後在送回db。

 

以上再請多多指教