• 【AngularJS学习笔记】01 指令、服务和过滤器


    AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-

    比如:

    ng-app 指令初始化一个 AngularJS 应用程序。注意ng-app一般为空,如果值不为空,就得加这样一句代码var app = angular.module('名字', []);

    ng-init 指令初始化应用程序数据。

    这个在之前已经说过了,下面讲一下之前没讲到的。

    ng-repeat指令与ng-options指令

    <!--一般ng-repeat通常用于ul与li这种列表和表格-->
    <div ng-app="" ng-init="names=[
    {name:'Jani',country:'Norway'},
    {name:'Hege',country:'Sweden'},
    {name:'Kai',country:'Denmark'}]">
    <p>循环对象:</p>
    <ul>
      <li ng-repeat="x    in names">
        {{ x.name + ', ' + x.country }}
      </li>
    </ul>
    </div>
    <!--一般ng-options通常用于select这种下拉框-->
    <select ng-model="selectedCar" ng-options="y.brand for (x, y) in cars">
    </select>
    <h1>你选择的是: {{selectedCar.brand}}</h1>
    <h2>模型: {{selectedCar.model}}</h2>
    <h3>颜色: {{selectedCar.color}}</h3>
    <p>下拉列表中的选项也可以是对象的属性。</p>
    </div>
    <script>
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope) {
        $scope.cars = {
            car01 : {brand : "Ford", model : "Mustang", color : "red"},
            car02 : {brand : "Fiat", model : "500", color : "white"},
            car03 : {brand : "Volvo", model : "XC90", color : "black"}
        }
    });
    </script>

    当然用ng-repeat也可以实现下拉框。

    <select ng-model="selectedSite">
    <option ng-repeat="x in sites" value="{{x.site}}">{{x.site}}</option>
    </select>

    ng-model 指令

    利用ng-model指令不仅可以双向绑定控件到AngularJS应用程序的变量,还可以用来验证数据有效性

    <form ng-app="" name="myForm">
        Email:
        <input type="email" name="myAddress" ng-model="text">
        <span ng-show="myForm.myAddress.$error.email">不是一个合法的邮箱地址</span>
    </form>

    提示信息会在 ng-show 属性返回 true 的情况下显示。

    ng-model 指令可以为应用数据提供状态值(invalid, dirty, touched, error,pristine):

    <form ng-app="" name="myForm" ng-init="myText = 'test@qq.com'">
      Email:
      <input type="email" name="myAddress" ng-model="myText" required>
      <p>编辑邮箱地址,查看状态的改变。</p>
      <h1>状态</h1>
      <p>Valid: {{myForm.myAddress.$valid}} (如果输入的值是合法的则为 true)。</p>
      <p>Dirty: {{myForm.myAddress.$dirty}} (如果值改变则为 true)。</p>
      <p>Pristine: {{myForm.myAddress.$pristine }} (如果值未改变则为 true)。</p>
      <p>Touched: {{myForm.myAddress.$touched}} (如果通过触屏点击则为 true)。</p>
    </form>

    ng-model 指令基于它们的状态为 HTML 元素提供了 CSS 类:

    input.ng-invalid {
        background-color: lightblue;
    }
    • ng-empty
    • ng-not-empty
    • ng-touched
    • ng-untouched
    • ng-valid
    • ng-invalid
    • ng-dirty
    • ng-pending
    • ng-pristine

    字面意思相信已经足够理解了,这就用来根据输入框的各种状况来显现相应的样式。

    自定义指令

    <body ng-app="myApp">
    <ng-My-Directive1></ng-My-Directive1>
    <div ng-My-Directive2></div>
    <div class="ng-My-Directive3"></div>
    <!-- directive: ng-My-Directive4 -->
    
    <script>
    var app = angular.module("myApp", []);
    app.directive("ngMyDirective1", function() {
        return {
            restrict : "E",
            template : "<h1>用元素来调用的的指令!</h1>"
        };
    });
    app.directive("ngMyDirective2", function() {
        return {
            restrict : "A",
            template : "<h1>用属性来调用的的指令!</h1>"
        };
    });
    app.directive("ngMyDirective3", function() {
        return {
            restrict : "C",
            template : "<h1>用类名来调用的的指令!</h1>"
        };
    });
    app.directive("ngMyDirective4", function() {
        return {
            restrict : "M",
            replace : true,//必须加这行代码,否则注释还是注释
            template : "<h1>用注释来调用的的指令!</h1>"
        };
    });
    </script>
    </body>

     控制器与作用域

     在之前我们看到了如何用控制器去控制AngularJS应用程序。

    ng-controller 指令定义了应用程序控制器。

    控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。

    AngularJS 使用$scope 对象来调用控制器。

    在 AngularJS 中, $scope 是一个应用象(属于应用变量和函数)。

    控制器的 $scope (相当于作用域、控制范围)用来保存AngularJS Model(模型)的对象。

    这个$scope就是作用域。

    控制器还能有方法

    <div ng-app="myApp" ng-controller="personCtrl">
    姓名: {{fullName()}}
    </div>
    <script>
    var app = angular.module('myApp', []);
    app.controller('personCtrl', function($scope) {
        $scope.fullName = function() {
            return $scope.firstName + " " + $scope.lastName;
        }
    });
    </script>

    同时控制器的这些代码可以放在外部JS中,我看到这个点的时候,第一个想到的就是我以后自己弄个组件出来容易太多了。cool~~~

    AngularJS 应用组成如下:

    • View(视图), 即 HTML。
    • Model(模型), 当前视图中可用的数据。
    • Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。

    scope 是模型。

    scope 是一个 JavaScript 对象,带有属性和方法,这些属性和方法可以在视图和控制器中使用。

    一个控制器就相当于有一个scope ,那么如何去在多个控制器之间传递信息呢?

    所有的应用都有一个根作用域 $rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中。

    $rootScope 可作用于整个应用中。是各个 controller 中 scope 的桥梁。用 rootscope 定义的值,可以在各个 controller 中使用

    <div ng-app="myApp" >
        <div ng-controller="myCtrl1">
            <h1>我叫{{myName}}</h1>
            <h1>我叫{{name}}</h1>
        </div>
        <div ng-controller="myCtrl2">
            <h1>我叫{{name}}</h1>
        </div>
    </div>
    <script>
    var app = angular.module('myApp', []);
    app.controller('myCtrl1', function($scope, $rootScope) {
        $scope.myName="哈哈";
        $rootScope.name = "Troy123";
    });
    app.controller('myCtrl2', function($scope, $rootScope) {
    });
    </script>

    服务Service

    在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用。

    AngularJS 内建了30 多个服务。

    之前看到的$scope$rootScope都是服务。

    var app = angular.module('myApp', []);
    app.controller('customersCtrl', function($scope, $location) {
        myUrl = $location.absUrl();
    });

    这里的 $location 服务,可以返回当前页面的 URL 地址。

    $http 是 AngularJS 应用中最常用的服务。服务向服务器发送请求,应用响应服务器传送过来的数据。

    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope, $http) {
        $http.get("welcome.htm").then(function (response) {
            $scope.myWelcome = response.data;
        });
    });

     或者

    var app = angular.module('myApp', []);
    app.controller('customersCtrl', function($scope, $http) {
        $http.get("http://www.runoob.com/try/angularjs/data/Customers_JSON.php")
        .success(function(response) {$scope.names = response.records;});
    });

    $timeout 服务对应了 JS window.setTimeout 函数,$interval 服务对应了 JS window.setInterval 函数。

    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope, $timeout,$interval) {
        $scope.myHeader = "Hello World!";
        $timeout(function () {
            $scope.myHeader = "How are you today?";
        }, 2000);
        $scope.theTime = new Date().toLocaleTimeString();
        $interval(function () {
            $scope.theTime = new Date().toLocaleTimeString();
        }, 1000);
    });

    自定义服务

    var app = angular.module('myApp', []);
    app.service('hexafy', function() {
        this.myFunc = function (x) {
            return x.toString(16);
        }
    });
    app.controller('myCtrl', function($scope, hexafy) {
      $scope.hex = hexafy.myFunc(255);
    });

    过滤器

    这个可以理解为是一个语法糖。

    三个一般的过滤器uppercase   lowercase    currency  

    <div ng-app="" ng-init="myName='Troy123';num=12.1">
        <p>大写化名字为 {{myName| uppercase }}</p><!--结果为TROY123-->
        <p>小写化为 {{myName| lowercase }}</p><!--结果为troy123-->
        <p>金额化为 {{num| currency  }}</p><!--结果为$12.10-->
    </div>

    两个特殊的过滤器 orderBy filter

    <div ng-app="myApp" ng-controller="namesCtrl">
    <p><input type="text" ng-model="myValue"></p>
    <ul>    
      <li ng-repeat="x in names | filter:myValue | orderBy:'country'">
        {{ (x.name | uppercase) + ', ' + x.country }}
      </li>
        <!--names的每个选项,首先得根据myValue进行筛选,包含输入框myValue的值的才能被列出来,然后要根据x的county的值进行排序-->
    </ul>
    </div>

    自定义过滤器

    还记得之前讲得服务吧,这里也可以在在自定义过滤器中,用自定义的服务

    <ul>
      <li ng-repeat="x in counts">{{x | myFormat}}</li>
    </ul>
    <p>过滤器使用服务将10进制转换为16进制。</p>
    </div>
    <script>
    var app = angular.module('myApp', []);
    app.service('myService', function() {
        this.myFunc = function (x) {
            return x.toString(16);
        }
    });
    app.filter('myFormat',['myService', function(hexafy) {
        return function(x) {
            return hexafy.myFunc(x);
        };
    }]);
    app.controller('myCtrl', function($scope) {
        $scope.counts = [255, 251, 200];
    });
    </script>
  • 相关阅读:
    UML用例图总结
    项目管理心得:一个项目经理的个人体会、经验总结
    UML类图符号简介
    C++中栈和堆上建立对象的区别
    Win32 API
    Python
    remove extra kernel
    Create short cut
    Set Form Position
    Get folder
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5218517.html
Copyright © 2020-2023  润新知