AngularJs(四)--过滤器& $apply & $run

来源:互联网 发布:log4j打印sql 编辑:程序博客网 时间:2024/06/06 04:22

$scope–局部作用域

  • scope.watch –监听数据变化(前文讲过)
  • scope.apply
    在前文讲到,要实现数据变化,视图也能自动跟着变化需求。在原生JS的setTimeout方法中直接修改$scope.name,运行后该属性等到规定时间时,不会被改变。

    解决方案有两种:
    (1)直接使用angularJs提供的$timeout服务;

    (2)在setTimeout定时器中,使用scope.apply()方法,同样能够实现。
    代码如下:

    <pre>    <!DOCTYPE html>    <html lang="en" ng-app="app">    <head>        <meta charset="UTF-8">        <title>Title</title>        <script src="js/angular.min.js"></script>        <script type="text/javascript">            var app=angular.module("app",[]);            app.controller("Aaa",Aaa);            function Aaa($scope){                $scope.name="hello";                //方法一                /*$timeout(function(){                    $scope.name="hi";                },2000);*/                setTimeout(function(){                    //在原生JS的setTimeout方法中直接修改,运行结果的name值不会变成“hi”                    //$scope.name="hi";                    //方法二                    $scope.$apply(function(){                        $scope.name="hi";                    })                },2000);            }        </script>    </head>    <body>        <div ng-controller="Aaa">            <p>{{name}}</p>        </div>    </body>    </html></pre>

scope.apply(fn)方法可以监听处理函数内部的属性变化。一旦有变化,会影响相应视图。
相比较下,它的好处是可以在第三方库或原生JS的方法中都是可以直接来用的。
其实,在AngularJs和事件的源码中,也是调用scope.apply(fn)方法来实现的。

angular.module

用来创建模块,返回一个模块对象。
- controller –创建控制器,前文讲过。(一个模块对象可以创建多个控制器)
- run

    <pre>        <!DOCTYPE html>        <html lang="en" ng-app="app">        <head>            <meta charset="UTF-8">            <title>Title</title>            <script src="js/angular.min.js"></script>            <script type="text/javascript">                var app=angular.module("app",[]);                app.run(["$rootScope",function($rootScope){                    $rootScope.name="hello";                }])s            </script>        </head>        <body>            <!--&lt;!&ndash;div ng-controller="Aaa">&ndash;&gt;                <p>{{name}}</p>            </div>-->            此时不需要写ng-controller指令就能解析            <p>{{name}}</p>        </body>        </html>    </pre>

run方法的作用在于初始化一些全局的数据,省略了创建控制器并在页面引入控制器指令等的操作。

注意:run方法只能有rootScopescope。

filter过滤器

  1. 书写方式:
    表达式中,在变量的右边加一个管道符号“|”(竖线),再写上过滤器。如下所示:

    <pre>    <div ng-controller="Aaa">        <p>{{price | currency}}</p>//运行结果:$22,122.00        //修改货币的符号        <p>{{price | currency:"Y"}}</p>    </div></pre>
  2. 传递参数
    filter过滤器传递参数的方式:在过滤器后面+“:”(冒号)+参数,如上述代码所示。
    如果要传多个参数,写法是:
    <p>{{price | currency:"Y" : 二参 : 三参}}</p>

  3. 内置的过滤器
    - currency–将一串数字转为货币
    - number–将一串数字转为文本格式。
    <p>{{price | number}}</p><!--22,122-->
    当这串数字有小数时,number过滤器默认会保留(截取)取3位小数。
    若想设置保留小数的位数,可传递一个参数,代码如下:
    <p>{{price | number:2}}</p><!--22,122.34-->
    - uppercase/lowercase –大小写转换
    这两个过滤器没有什么参数可传。
    - json –可以将json字符串格式化,使之像对象的格式一样分行显示。代码如下:
    <pre>{{name | json }}</pre>,注意最好写在”<pre>“标签内,因为它是可以识别空格和换行的标签。
    - limitTo – 对数组或字符串的截取
    <p>{{name | limitTo:2 }}</p>//打印出“he”
    - date
    <p>{{time | date }}</p> //$scope.time= "34233332200";毫秒数,输出Feb 1, 1971
    要想设置特定的日期格式,需要为date过滤器传递参数。angular为我们提供了许多date过滤器的参数,具体可查看官方文档。
    <p>{{time | date: 'yyyy' }}</p>
    - orderBy – 对数组进行排序

            <pre>             app.controller("Aaa",function($scope){                $scope.arrName=[                    {color:"red",age:"20"},                    {color:"green",age:"25"},                    {color:"yellow",age:"16"},                    {color:"blue",age:"30"}                ];             }             <div ng-controller="Aaa">                  //此时是按照“color”对应值的字母从小到大排序                 <p>{{arrName | orderBy: 'color'}}</p>                  //此时是按照“age”对应值的数字从小到大排序                  <p>{{arrName | orderBy: 'age'}}</p>             </div>        </pre>    若想将"arrName"数组中的“age”属性从大到小排序,需要为orderBy过滤器添加第二个参数,代码如下:</br>    `<p>{{arrName | orderBy: 'age' : true }}</p>` - filter --过滤指定数据</br> `<p>{{arrName | filter:"red"}}</p> //运行输出[{"color":"red","age":"20"}]` </br> <font color="red">    上述代码中,filter的参数只能针对键值,对键名是没用的。</br> </font> `<p>{{arrName | filter:"l"}}</p> //运行输出[{"color":"yellow","age":"16"},{"color":"blue","age":"30"}]` </br>如果想完全匹配指定的数据,需要设置第二个参数为true,代码如下:</br>`<p>{{arrName | filter:"l": true}}</p> <!--运行输出[]-->`</br>由于“arrName”中的键值没有是“l”的,所以过滤后输出是“[]”空数组。
  4. 过滤器扩展
    - 可组合使用过滤器
    <p>{{name | limitTo:2 |uppercase}}</p> <!--运行输出“HE”-->
    - JS中使用过滤器
    上文中使用过滤器是在html的表达式后面使用的。而在JS中使用过滤器是通过一种服务的方式来实现的:$filter。
    注意:angular中的服务是需要通过依赖注入的方式注入进去。

            <pre>            <!DOCTYPE html>            <html lang="en" ng-app="app">            <head>                <meta charset="UTF-8">                <title>Title</title>                <script src="js/angular.min.js"></script>                <script type="text/javascript">                    var app=angular.module("app",[]);                    //注入过滤器服务                    app.controller("Aaa",["$scope","$filter",function($scope,$filter){                        $scope.name= $filter('uppercase')('hello');                        //参数是在后面以逗号隔开后添加                         $scope.price= $filter('number')('3423333.34988',2);                    }])                </script>            </head>            <body>                <div ng-controller="Aaa">                    <!-- 输出大写的“HELLO”-->                    <p>{{name}}</p>                     <!--输出“3,423,333.35”-->                     <p>{{price}}</p>                </div>            </body>            </html>        </pre>
  5. 自定义过滤器
    是通过angular.module方法下的filter来实现。

                <pre>                <!DOCTYPE html>                <html lang="en" ng-app="app">                <head>                    <meta charset="UTF-8">                    <title>Title</title>                    <script src="js/angular.min.js"></script>                    <script type="text/javascript">                        var app=angular.module("app",[]);                        //注入过滤器服务                        app.controller("Aaa",["$scope","$filter",function($scope,$filter){                           /*$scope.name="hello";*/                           $scope.name=$filter("firstUpper")("great",2);                        }])                        //自定义过滤器                        app.filter("firstUpper",function(){                            //此处的“str”是需要做过滤操作的属性值                            //此处的num就是过滤器的第一个传入的参数                            return function(str,num){                                console.log(num);//打印出2                                return str.charAt(0).toUpperCase()+str.substring(1);                            }                        });                    </script>                </head>                <body>                    <div ng-controller="Aaa">                        <!-- 输出“Hello”-->                        <!--<p>{{name | firstUpper}}</p>                        <p>{{name | firstUpper : 2 }}</p>-->                        <!-- 输出“Great”-->                        <p>{{name}}</p>                    </div>                </body>                </html>            </pre>