angular中的過濾使用淺析



1.1. angular中的過濾使用淺析

1.2. 本文章主要針對 angular內置對象的使用和自定義對象的使用進行解析

1.3. 過濾器( filter )

    1.- 在 ng 中過濾器是用在表達式中, 或代碼中將某一個數據進行格式化或篩選轉換而用的語法結構.

1.4. 語法1:

    {{ ng 表達式 | 過濾器名 :參數1 :參數2 }}

    類似:

    function 過濾器名( ng 表達式, 參數1, 參數2 ) {
        return ...
    }

1.5. 語法2:

    在 代碼中 注入 $filter 函數, 該函數需要字符串參數, 用於描述需要拿到什麼過濾器,
    $filter 函數返回一個函數, 這個返回的函數即可實現格式化或篩選. 
    這裏函數第一個參數是需要過濾的數據, 第二個以後的參數是在過濾時需要的參數.

1.5.1. 在angular中內置了9個過濾器,如下所示:

    - currency       貨幣過濾器
    - date           日期過濾器
    - filter         自定義過濾器
    - json           json過濾器(不太常用)
    - limitTo        限制(或者成爲條件)過濾器
    - lowercase      小寫字母過濾器
    - number         數字過濾器
    - orderBy        排序過濾器
    - uppercase      大寫字母過濾器

1.6. currency 貨幣過濾器

1.6.1. 解析:

    0、currency過濾器會把一個數字,改成美元形式,例如: 123455  -----》   $123,455.00
    1、<script src="./angular-locale_zh-cn.js"></script> 是爲了把金幣符號轉換爲人民幣¥的符號
    2、 默認的金幣符號是美元的符號
    3、currency會默認保留小數點後兩位,沒有小數點的話用"xxx.00"補齊

1.7. 示例demo:

    <script>
    angular.module('currencyExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.amount = 1234.56;
    }]);
    </script>
    <div ng-controller="ExampleController">
    <input type="number" ng-model="amount" aria-label="amount"> <br>
    default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
    custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span>
    no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span>
    </div>

1.8. date 日期過濾器

1.8.1. 解析:

    1、new Date()創建的對象時間日期存儲的形式爲 Thu Mar 30 2017 22:42:32 GMT+0800 (中國標準時間)
    同過date過濾器可以很輕鬆的改成我們想要的時間日期的樣式:
            例如  now | date :'yyyy年MM月dd日 hh時mm分ss秒'   可以把時間轉換成 2017年03月30日 10 時44分37秒 
    2、date過濾器中的  漢子都可以隨便改, 但是 yyyy MM 等不能修改。
    3、date過濾器很靈活,比如 要轉換成 10 時44分37秒 ,把過濾器改成:now | date :'hh時mm分ss秒'
                            要轉換成 10 :44:37   ,把過濾器改成:now | date :'hh :mm :ss'
                            要轉換成 10 時44分 ,把過濾器改成:now | date :'hh時mm分'
    4、<script src="./angular-locale_zh-cn.js"></script>文件是爲了把時間轉換成中國本地的時間形式

1.9. 示例demo

    <script src="../../angular.js"></script>
    <script src="./angular-locale_zh-cn.js"></script>
    <body ng-app="mainApp">
    {{ now }}
    <br>
    {{ now | date :'yyyy年MM月dd日 hh時mm分ss秒' }}
    <br>
    {{ now | date :'MM月dd日 yyyy年 hh時mm分ss秒 EEEE' }}
    </body>
    <script>
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.now = new Date();
            });
    </script>

1.10. date過濾器的另一種書寫形式

    <body ng-app="mainApp">
    {{ now }}
    </body>

    <script>
    angular.module( 'mainApp', [] )
                                                            // 1, 注入 $filter
            .run( [ '$rootScope', '$filter', function ( $rootScope, $filter ) {
            var curr = new Date();
            // 2, 利用 $filter 拿到 date 過濾器
            var dateFn = $filter( 'date' );
            // 此時 dateFn 就是一個用於過濾時間對象的函數
            // 該函數有兩個參數, 第一個參數是需要過濾的數據
            // 第二個參數是 過濾使用的格式
            $rootScope.now = dateFn( curr, 'yyyy-MM-dd HH:mm:ss EEEE 哈哈哈哈' );
            }]);
    </script>

1.11. limitTo 限制過濾器

1.11.1. 解析

    1、常常用於將一個數組或字符串中的某一部分取出來
    2、當要過濾數組,且過濾器後面的參數是一個數字,這時候取出數組的前幾個元素,
       當要過濾數組,且過濾器後面的參數是有兩個參數,第一個表示要過濾的長度,第二個表示開始的元素
    3、當要過濾字符串時,且過濾器後面傳入一個數字參數時,表示要取出字符串的前幾個字符
       當要過濾字符串時,且過濾器後面傳入連個參數時,第一個表示要過濾的長度,第二個表示開始的字符

1.12. 示例demo:

    <script>
    angular.module('limitToExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.numbers = [1,2,3,4,5,6,7,8,9];
    $scope.letters = "abcdefghi";
    $scope.longNumber = 2345432342;
    $scope.numLimit = 3;
    $scope.letterLimit = 3;
    $scope.longNumberLimit = 3;
    }]);
    </script>
    <div ng-controller="ExampleController">
    <label>
    Limit {{numbers}} to:
    <input type="number" step="1" ng-model="numLimit">
    </label>
    <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
    <label>
    Limit {{letters}} to:
    <input type="number" step="1" ng-model="letterLimit">
    </label>
    <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
    <label>
    Limit {{longNumber}} to:
    <input type="number" step="1" ng-model="longNumberLimit">
    </label>
    <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>
    </div>

1.12.1. 重點是 filter 過濾器(重點)

1.12.2. 解析:

    1、 filter 過濾器的使用
         語法: 表達式 | filter: 參數
         在一個數組或對象或字符串中利用 filter 過濾, 取出符合過濾項的數據

         filter 的參數就是過濾的條件
    2、參數可以是
         1> 字符串( 遍歷每一個數據中的 每一個數據 如果匹配到了就保留下來 )
         2> 對象( 提供鍵值, 在過濾的時候會根據鍵來尋找 )
         3> 函數( 根據每一個數據都會調用一次函數, 根據函數的返回值來確定是否需要保留數據 )

1.13. 示例demo(參數爲字符串):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: txt">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;
            });
    </script>
    </html>

1.14. 示例demo2(參數爲對象):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: { name: txt }">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;
            });
    </script>
    </html>

1.15. 示例demo3(參數爲函數時):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: getLt30">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;

            $rootScope.getLt30 = function ( curr, index, arr ){
                    // 第一個參數是當前遍歷的元素
                    // return curr.age <= 30;

                    var value = $rootScope.txt || 0;

                    // value 爲一個字符串, 爲 0
                    if ( value != 0 ) {
                    value = parseInt( value ); // NaN
                    }

                    // 0, 數字, NaN
                    if ( value != value ) {
                    value = 0;
                    }
                    // 0 或 數字

                    console.log( value );

                    if ( value ) {
                    return curr.age <= value;
                    } 
                    return true;
            };
            });
    </script>
    </html>

1.16. 示例demo(綜合案例)4:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    <style>
            .clickable {
            cursor: pointer;
            }
    </style>
    </head>
    <body ng-app="mainApp">
    <input type="button" value="按照年齡排序" ng-click="txt= txt=='age' ? '-age': 'age'" > <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th class="clickable" ng-click="txt= txt=='name' ? '-name': 'name'">name</th>
            <th class="clickable" ng-click="txt= txt=='age' ? '-age': 'age'">age</th>
            <th class="clickable" ng-click="txt= txt=='gender' ? '-gender': 'gender'">gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | orderBy:txt">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;

            // $rootScope.txt = 'age'; // 按照 'age' 這個屬性升序排序
            // $rootScope.txt = '-age';
            });
    </script>
    </html>

1.17. 自定義過濾器

    步驟:1、現在js中定義一個過濾器
          2、在代碼中使用

1.17.1. 示例demo解析:

    <body ng-app="mainApp">
            {{ 'getElementById' | myConvert }}
            <br>
            {{ 'getElementById' }}
            <br>
            {{ txt }}
    </body>
    <script>
    angular.module( 'mainApp', [] )
    .filter( 'myConvert', [ '$filter', function ( $filter ) {
        return function ( data ) {
            return data.replace( /(.)([A-Z])/g, function ( _, a, b ) {
                return a + '-' + b.toLowerCase();
            }).replace( /(.)([A-Z])/g, function ( _, a, b ) {
                return a + '-' + b.toLowerCase();
            });
        }
    }] )
    .run( [ '$rootScope', '$filter', function ( $rootScope, $filter ) {
        $rootScope.txt = $filter( 'myConvert' )( 'querySelectotAll' );
    }] )
    </script>       

1.17.1.1. 以上過濾器實現了駝峯轉換,例如: 'getElementById' -> 'get-element-by-id'

1.18. orderBy 排序過濾器

1.18.1. 解析:

        1、接受一個字符串表示要排序的條件
        2、一下例子中點擊每一個表頭(即th標籤)中的內容自動按照當前組排序

1.18.1.1. 示例demo:

    <style>
            table {
            margin: 0 auto;
            }
            th {
            cursor: pointer;
            }
    </style>

    <body ng-app="mainApp">
    <div class="container" ng-controller="mainController">
            <table width="600" border="1px solid #ccc">
            <th>序號</th>
            <th ng-click="txt = txt == 'name' ? '-name': 'name'">姓名</th>
            <th ng-click="txt = txt == 'age' ? '-age': 'age'">年齡</th>
            <th ng-click="txt = txt == 'gender' ? '-gender': 'gender'">性別</th>
            <tr ng-repeat="item in list |orderBy : txt">
                    <td>{{$index+1}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.age}}</td>
                    <td>{{item.gender}}</td>
            </tr>
            </table>
    </div>
    <script>
            var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
            ];

            angular.module('mainApp', [])
            .controller('mainController', ['$scope', function ($scope) {
                    $scope.list = data;

            }])
    </script>
    </body>

1.1. angular中的過濾使用淺析

1.2. 本文章主要針對 angular內置對象的使用和自定義對象的使用進行解析

1.3. 過濾器( filter )

    1.- 在 ng 中過濾器是用在表達式中, 或代碼中將某一個數據進行格式化或篩選轉換而用的語法結構.

1.4. 語法1:

    {{ ng 表達式 | 過濾器名 :參數1 :參數2 }}

    類似:

    function 過濾器名( ng 表達式, 參數1, 參數2 ) {
        return ...
    }

1.5. 語法2:

    在 代碼中 注入 $filter 函數, 該函數需要字符串參數, 用於描述需要拿到什麼過濾器,
    $filter 函數返回一個函數, 這個返回的函數即可實現格式化或篩選. 
    這裏函數第一個參數是需要過濾的數據, 第二個以後的參數是在過濾時需要的參數.

1.5.1. 在angular中內置了9個過濾器,如下所示:

    - currency       貨幣過濾器
    - date           日期過濾器
    - filter         自定義過濾器
    - json           json過濾器(不太常用)
    - limitTo        限制(或者成爲條件)過濾器
    - lowercase      小寫字母過濾器
    - number         數字過濾器
    - orderBy        排序過濾器
    - uppercase      大寫字母過濾器

1.6. currency 貨幣過濾器

1.6.1. 解析:

    0、currency過濾器會把一個數字,改成美元形式,例如: 123455  -----》   $123,455.00
    1、<script src="./angular-locale_zh-cn.js"></script> 是爲了把金幣符號轉換爲人民幣¥的符號
    2、 默認的金幣符號是美元的符號
    3、currency會默認保留小數點後兩位,沒有小數點的話用"xxx.00"補齊

1.7. 示例demo:

    <script>
    angular.module('currencyExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.amount = 1234.56;
    }]);
    </script>
    <div ng-controller="ExampleController">
    <input type="number" ng-model="amount" aria-label="amount"> <br>
    default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
    custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span>
    no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span>
    </div>

1.8. date 日期過濾器

1.8.1. 解析:

    1、new Date()創建的對象時間日期存儲的形式爲 Thu Mar 30 2017 22:42:32 GMT+0800 (中國標準時間)
    同過date過濾器可以很輕鬆的改成我們想要的時間日期的樣式:
            例如  now | date :'yyyy年MM月dd日 hh時mm分ss秒'   可以把時間轉換成 2017年03月30日 10 時44分37秒 
    2、date過濾器中的  漢子都可以隨便改, 但是 yyyy MM 等不能修改。
    3、date過濾器很靈活,比如 要轉換成 10 時44分37秒 ,把過濾器改成:now | date :'hh時mm分ss秒'
                            要轉換成 10 :44:37   ,把過濾器改成:now | date :'hh :mm :ss'
                            要轉換成 10 時44分 ,把過濾器改成:now | date :'hh時mm分'
    4、<script src="./angular-locale_zh-cn.js"></script>文件是爲了把時間轉換成中國本地的時間形式

1.9. 示例demo

    <script src="../../angular.js"></script>
    <script src="./angular-locale_zh-cn.js"></script>
    <body ng-app="mainApp">
    {{ now }}
    <br>
    {{ now | date :'yyyy年MM月dd日 hh時mm分ss秒' }}
    <br>
    {{ now | date :'MM月dd日 yyyy年 hh時mm分ss秒 EEEE' }}
    </body>
    <script>
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.now = new Date();
            });
    </script>

1.10. date過濾器的另一種書寫形式

    <body ng-app="mainApp">
    {{ now }}
    </body>

    <script>
    angular.module( 'mainApp', [] )
                                                            // 1, 注入 $filter
            .run( [ '$rootScope', '$filter', function ( $rootScope, $filter ) {
            var curr = new Date();
            // 2, 利用 $filter 拿到 date 過濾器
            var dateFn = $filter( 'date' );
            // 此時 dateFn 就是一個用於過濾時間對象的函數
            // 該函數有兩個參數, 第一個參數是需要過濾的數據
            // 第二個參數是 過濾使用的格式
            $rootScope.now = dateFn( curr, 'yyyy-MM-dd HH:mm:ss EEEE 哈哈哈哈' );
            }]);
    </script>

1.11. limitTo 限制過濾器

1.11.1. 解析

    1、常常用於將一個數組或字符串中的某一部分取出來
    2、當要過濾數組,且過濾器後面的參數是一個數字,這時候取出數組的前幾個元素,
       當要過濾數組,且過濾器後面的參數是有兩個參數,第一個表示要過濾的長度,第二個表示開始的元素
    3、當要過濾字符串時,且過濾器後面傳入一個數字參數時,表示要取出字符串的前幾個字符
       當要過濾字符串時,且過濾器後面傳入連個參數時,第一個表示要過濾的長度,第二個表示開始的字符

1.12. 示例demo:

    <script>
    angular.module('limitToExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.numbers = [1,2,3,4,5,6,7,8,9];
    $scope.letters = "abcdefghi";
    $scope.longNumber = 2345432342;
    $scope.numLimit = 3;
    $scope.letterLimit = 3;
    $scope.longNumberLimit = 3;
    }]);
    </script>
    <div ng-controller="ExampleController">
    <label>
    Limit {{numbers}} to:
    <input type="number" step="1" ng-model="numLimit">
    </label>
    <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
    <label>
    Limit {{letters}} to:
    <input type="number" step="1" ng-model="letterLimit">
    </label>
    <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
    <label>
    Limit {{longNumber}} to:
    <input type="number" step="1" ng-model="longNumberLimit">
    </label>
    <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>
    </div>

1.12.1. 重點是 filter 過濾器(重點)

1.12.2. 解析:

    1、 filter 過濾器的使用
         語法: 表達式 | filter: 參數
         在一個數組或對象或字符串中利用 filter 過濾, 取出符合過濾項的數據

         filter 的參數就是過濾的條件
    2、參數可以是
         1> 字符串( 遍歷每一個數據中的 每一個數據 如果匹配到了就保留下來 )
         2> 對象( 提供鍵值, 在過濾的時候會根據鍵來尋找 )
         3> 函數( 根據每一個數據都會調用一次函數, 根據函數的返回值來確定是否需要保留數據 )

1.13. 示例demo(參數爲字符串):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: txt">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;
            });
    </script>
    </html>

1.14. 示例demo2(參數爲對象):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: { name: txt }">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;
            });
    </script>
    </html>

1.15. 示例demo3(參數爲函數時):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    </head>
    <body ng-app="mainApp">
    <input type="text" ng-model="txt"> <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th>name</th>
            <th>age</th>
            <th>gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | filter: getLt30">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;

            $rootScope.getLt30 = function ( curr, index, arr ){
                    // 第一個參數是當前遍歷的元素
                    // return curr.age <= 30;

                    var value = $rootScope.txt || 0;

                    // value 爲一個字符串, 爲 0
                    if ( value != 0 ) {
                    value = parseInt( value ); // NaN
                    }

                    // 0, 數字, NaN
                    if ( value != value ) {
                    value = 0;
                    }
                    // 0 或 數字

                    console.log( value );

                    if ( value ) {
                    return curr.age <= value;
                    } 
                    return true;
            };
            });
    </script>
    </html>

1.16. 示例demo(綜合案例)4:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="../../angular.js"></script>
    <style>
            .clickable {
            cursor: pointer;
            }
    </style>
    </head>
    <body ng-app="mainApp">
    <input type="button" value="按照年齡排序" ng-click="txt= txt=='age' ? '-age': 'age'" > <br>
    <table border="1" width="800">
            <thead>
            <th>編號</th>
            <th class="clickable" ng-click="txt= txt=='name' ? '-name': 'name'">name</th>
            <th class="clickable" ng-click="txt= txt=='age' ? '-age': 'age'">age</th>
            <th class="clickable" ng-click="txt= txt=='gender' ? '-gender': 'gender'">gender</th>
            </thead>
            <tbody>
            <tr ng-repeat="item in list | orderBy:txt">
                    <td>{{ $index }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.age }}</td>
                    <td>{{ item.gender }}</td>
            </tr>
            </tbody>
    </table>
    </body>
    <script>
    var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
    ];
    angular.module( 'mainApp', [] )
            .run( function ( $rootScope ) {
            $rootScope.list = data;

            // $rootScope.txt = 'age'; // 按照 'age' 這個屬性升序排序
            // $rootScope.txt = '-age';
            });
    </script>
    </html>

1.17. 自定義過濾器

    步驟:1、現在js中定義一個過濾器
          2、在代碼中使用

1.17.1. 示例demo解析:

    <body ng-app="mainApp">
            {{ 'getElementById' | myConvert }}
            <br>
            {{ 'getElementById' }}
            <br>
            {{ txt }}
    </body>
    <script>
    angular.module( 'mainApp', [] )
    .filter( 'myConvert', [ '$filter', function ( $filter ) {
        return function ( data ) {
            return data.replace( /(.)([A-Z])/g, function ( _, a, b ) {
                return a + '-' + b.toLowerCase();
            }).replace( /(.)([A-Z])/g, function ( _, a, b ) {
                return a + '-' + b.toLowerCase();
            });
        }
    }] )
    .run( [ '$rootScope', '$filter', function ( $rootScope, $filter ) {
        $rootScope.txt = $filter( 'myConvert' )( 'querySelectotAll' );
    }] )
    </script>       

1.17.1.1. 以上過濾器實現了駝峯轉換,例如: 'getElementById' -> 'get-element-by-id'

1.18. orderBy 排序過濾器

1.18.1. 解析:

        1、接受一個字符串表示要排序的條件
        2、一下例子中點擊每一個表頭(即th標籤)中的內容自動按照當前組排序

1.18.1.1. 示例demo:

    <style>
            table {
            margin: 0 auto;
            }
            th {
            cursor: pointer;
            }
    </style>

    <body ng-app="mainApp">
    <div class="container" ng-controller="mainController">
            <table width="600" border="1px solid #ccc">
            <th>序號</th>
            <th ng-click="txt = txt == 'name' ? '-name': 'name'">姓名</th>
            <th ng-click="txt = txt == 'age' ? '-age': 'age'">年齡</th>
            <th ng-click="txt = txt == 'gender' ? '-gender': 'gender'">性別</th>
            <tr ng-repeat="item in list |orderBy : txt">
                    <td>{{$index+1}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.age}}</td>
                    <td>{{item.gender}}</td>
            </tr>
            </table>
    </div>
    <script>
            var data = [
            { name: 'jim', age: 89, gender: 'man' },
            { name: 'tom', age: 29, gender: 'female' },
            { name: 'jack', age: 39, gender: 'man' },
            { name: 'jerry', age: 49, gender: 'female' },
            { name: 'rose', age: 59, gender: 'man' },
            { name: 'bob', age: 69, gender: 'female' },
            { name: 'deve', age: 79, gender: 'man' },
            { name: 'hanmeimei', age: 19, gender: 'female' }
            ];

            angular.module('mainApp', [])
            .controller('mainController', ['$scope', function ($scope) {
                    $scope.list = data;

            }])
    </script>
    </body>

發佈了24 篇原創文章 · 獲贊 75 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章