• 路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分。

    路由只是从一个页面重定向到另一个页面。在任何web应用中路由都很重要。AngularJs是一个单页面应用程序,一旦应用程序加载,它永远不会重新加载。在这种情况下我们如何实现路由?我们可以使用指令模板从一个模板导航到另一个模板,但是最好不要这样做,而是将视图限制在布局和模板视图中,并以URL显示模板视图。

    看一个实例:

    <body ng-app="myApp">
    <p><a href="#/!">Main</a></p>
    <a href="#!red">Red</a>
    <a href="#!green">Green</a>
    <a href="#!blue">Blue</a>
    <div ng-view></div>
    <script>
    var app = angular.module("myApp", ["ngRoute"]);
    app.config(function($routeProvider) {
        $routeProvider
        .when("/", {
            templateUrl : "main.htm"
        })
        .when("/red", {
            templateUrl : "red.htm"
        })
        .when("/green", {
            templateUrl : "green.htm"
        })
        .when("/blue", {
            templateUrl : "blue.htm"
        });
    });
    </script>
    </body>
    

    当Red被点击时,<div ng-view></div>中会载入red.htm文件中的内容

    整个过程中页面不需要重新加载。

    ng-view

    ng-view 是ngRoute中包含的一个特殊指令。它相当与一个占位符,表示即将载入页面的位置。

    有三种不同的方式可以达到效果:

    • <div ng-view></div>
    • <ng-view></ng-view>
    • <div class="ng-view"></div>

    应用程序只能有一个ng-view指令.

    $routeProvider

    $routeProvider是配置在应用程序的config部分配置路由的提供程序服务,使用$routeProvider您可以定义当用户点击一个链接,显示的页面。

    定义$routeProvider的例子

    var app = angular.module("myApp", ["ngRoute"]);
    app.config(function($routeProvider) {
        $routeProvider
        .when("/", {
            templateUrl : "main.htm"
        })
        .when("/london", {
            templateUrl : "london.htm"
        })
        .when("/paris", {
            templateUrl : "paris.htm"
        });
    });
    

    controller

    随着$routeProvider的使用,你可以定义每个视图的控制器

    var app = angular.module("myApp", ["ngRoute"]);
    app.config(function($routeProvider) {
        $routeProvider
        .when("/", {
            templateUrl : "main.htm"
        })
        .when("/london", {
            templateUrl : "london.htm",
            controller : "londonCtrl"   //添加控制器
        })
        .when("/paris", {
            templateUrl : "paris.htm",
            controller : "parisCtrl"    //添加控制器
        });
    });
    app.controller("londonCtrl", function ($scope) {
        $scope.msg = "I love London";
    });
    app.controller("parisCtrl", function ($scope) {
        $scope.msg = "I love Paris";
    });
    

    然后你可以在london.htm或者paris.htm中使用{{ msg }}

    london.htm

    <p>{{ msg }}</p>    // I love London
    

    template

    在前面的例子中,我们在$routeProvider.when中使用了templateUrl,这个参数用来插入HTML文件

    $routeProvider.when('/computers', {
        templateUrl: 'views/computers.html',
    });
    

    以上代码会从服务端获取 views/computers.html 文件内容插入到 ng-view 中。

    otherwise

    在$routeProvider中还有个otherwise方法

    var app = angular.module("myApp", ["ngRoute"]);
    app.config(function($routeProvider) {
       $routeProvider
        .when("/banana", {
            template : "<h1>Banana</h1><p>Bananas contain around 75% water.</p>"
        })
        .when("/tomato", {
            template : "<h1>Tomato</h1><p>Tomatoes contain around 95% water.</p>"
        })
        .otherwise({
            template : "<h1>Nothing</h1><p>Nothing has been selected</p>"
        });
    });
    

    上面的例子中,倘若既不是banana又不是tomato的链接被点击时,就会插入


  • AngularJS 表单是输入控件的集合。

    HTML 控件

    以下 HTML input 元素被称为 HTML 控件:

    • input 元素
    • select 元素
    • button 元素
    • textarea 元素

    ng中的表单与Controller

    看这个小标题也行你会差异,表单验证,怎么跟controller扯上关系了。ng中的form已经不同于我们平时用的form标签,做了增强。form是FormController的一个实例。如何理解这句话呢?想想我们使用ng-controller指令的情景:

    <div ng-controller="testC">
      <input type="test" ng-model="a" />
    </div>
    <scritp>
    function testC($scope){
      //.............
    }
    </script>
    

    应用了ng-controller的div就是testC的一个实例,我们可以在模板中使用定义在$scopt上的任何属性和方法,而testC的定义也是由我们自己实现的。当我们使用<form>的时候也是这样的道理,FormController由ng为我们定义好了,有一系列属性和方法提供给我们完成验证工作,form实例通过name属性来进行标识,我们可以通过此标识来访问form实例的属性和方法,如:

    <form name="myform">
      {{ myform.$valid }}
    </form>
    

    form提供的属性都是用来表示表单的验证状态的,包括:$pristine(表单没有填写记录)、$dirty(表单有填写记录)、$valid(通过验证)、$invalid(未通过验证)、$error(验证错误信息)。除$error外,前四个的值为true或false表示相应的状态。$error的值为一个js对象,包含了以下验证内容的状态:

    • email
    • max
    • maxlength
    • min
    • minlength
    • number
    • pattern
    • required
    • url

    这些内容我们会在稍后的例子中看到。FormController还提供了一些方法,我们一般不手工调用它们,都是系统自己调用。可参考官方文档:http://docs.angularjs.org/api/ng.directive:form.FormController

    表单元素,如input、checkbox、radio等也不是普通的表单元素了,它们通通是NgModelController的实例。与form一样,也是通过name属性来标识。FormController拥有的那五个属性,NgModelController也同样拥有,除此之外,还有许多额外的属性和方法,我们稍后也在示例中展示,可参考官方文档:http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController

    还有一个特性需要了解,一个表单中的表单元素,会作为这个form的属性自动加在上面,通过name标识就可以访问到,如:

    <form name="myform">
      <input type="text" name="myname" />
      {{myform.myname.$valid}}
    </form>
    

    表单绑定实例

    <div ng-app="" ng-controller="formController">
      <form novalidate>
        First Name:<br>
        <input type="text" ng-model="user.firstName"><br>
        Last Name:<br>
        <input type="text" ng-model="user.lastName">
        <br><br>
        <button ng-click="reset()">RESET</button>
      </form>
      <p>form = {{user}}</p>
      <p>master = {{master}}</p>
    </div>
    <script>
    function formController ($scope) {
        $scope.master = {firstName: "John", lastName: "Doe"};
        $scope.reset = function() {
            $scope.user = angular.copy($scope.master);
        };
        $scope.reset();
    };
    </script>
    

    实例解析

    AngularJS ng-model 指令用于绑定 input 元素到模型中。

    模型对象 master 的值为 {"firstName" : "John", "lastName" : "Doe"}

    模型函数 reset 设置了模型对象 user 等于 master。

    AngularJS提供可与HTML控件相关联的多个事件。例如ng-click通常与按钮相关联。以下是AngularJS支持的事件。

    • ng-click
    • ng-dbl-click
    • ng-mousedown
    • ng-mouseup
    • ng-mouseenter
    • ng-mouseleave
    • ng-mousemove
    • ng-mouseover
    • ng-keydown
    • ng-keyup
    • ng-keypress
    • ng-change

    ng内置的验证规则

    ng框架提供了非常方便的验证机制,你只需要在标签上加点指令,像使用HTML5提供的验证那样,然后在css中根据规则定义好正确/错误的样式就OK了,例如我们要让一个文本框为必填项,使用required:

    <form name="myform novalidate">
      <input type="text" ng-model="a" required />
    </form>
    

    有几点需要注意:

    1、在<form>上加了一个novalidate,用来禁止掉浏览器默认的验证行为,因为ng已经对HTML5的几种表单新特性做了兼容处理。

    2、表单元素必须有ng-model,否则无法触发验证

    3、在css中分别定义.ng-pristine.ng-valid.ng-invalid.ng-dirty这四种样式,ng会根据相应的状态自动加上样式。

    只在提交表单后显示错误信息

    有时候不想在用户正在输入的时候显示错误信息. 当前错误信息会在用户输入表单时立即显示. 由于Angular很棒的数据绑定特性,这是可以发生的. 因为所有的事务都可以在一瞬间发生改变,这在表单验证时会有副作用.

    对于你想要只在表单正要提交之后才显示错误消息的场景, 你就需要对上面的代码做一些小调整.

    1、你要去掉提交按钮上的ng-disabled,因为我们想要用户即使是在表单没有全部验证完的情况下也能点击提交.

    2、你要在表单已经被提交之后添加一个变量. 在你的 submitForm() 函数中, 只要加入 $scope.submitted = true 就行了;. 一旦表单被提交,它就会保存提交值为true的submitted变量.

    3、将错误规则从ng-class="{ 'has-error' : userForm.name.$invalid && !userForm.name.$pristine }" 调整为 ng-class="{ 'has-error' : userForm.name.$invalid && !userForm.name.$pristine && submitted }". 这就确保了错误消息只会在表单被提交时被显示出来. 你也许会需要为这个变量调整所有其它的 ng-class 和 ng-show.

    现在,只有在submitted变量被设置为true时才会显示错误信息.


  • 这里讲一下AngularJS比较简单的几个事件,包括ng-click``ng-selected``ng-change

    ng-click

    ng-click指令用来定义HTML元素被点击后触发的事件。

    <div ng-app="">
      <button ng-click="count = count + 1" ng-init="count = 1">ClickMe</button>
      <p>{{ count }}</p>
    </div>
    

    上面的click定义了一个表达式(expression)每次点击button后,count便加一。

    ng-click事件还可以触发一个函数

    <div ng-app="myapp" ng-controller="myCtrl">
      <button ng-click="click()">clickFun</button>
    </div>
    <script type="text/javascript">
      var app = angular.module("myapp",[]);
      app.controller("myCtrl",function($scope){
        $scope.click = function(){
          alert("you clicked me!");
        }
      })
    </script>
    

    上面的实例展示了当Button被点击时触发一个函数的例子。

    ng-selected

    ng-selected 指令用于设置<select>列表中的 <option> 元素的 selected 属性。ng-selected 属性的表达式返回 true 则选项被选中。

    <div ng-app="">
      点击复选框选择 BMW 选项:
      <input type="checkbox" ng-model="mySel">
      <p>我喜欢的车:</p>
      <select>
        <option>Volvo</option>
        <option ng-selected="mySel">BMW</option>
        <option>Ford</option>
      </select>
    </div>
    

    上面的例子展示了当checkbox被选中时,即mySeltrue时,ng-seletedmySel的选项被选中。

    ng-change

    ng-change指令定义了当HTML元素改变的时候触发的事件。

    ng-change需要搭配ng-model指令使用。

    <div ng-app="myapp" ng-controller="myCtrl">
      <input type="text" ng-change="myFunc()" ng-model="myValue" />
      <p>The input field has changed {{ count }} times.</p>
    </div>
    <script type="text/javascript">
    var app = angular.module("myapp",[]);
    app.controller("myCtrl",function($scope){
      $scope.count = 0;
      $scope.myFunc = function(){
        $scope.count++;
      }
    })
    </script>
    

    上面的例子演示了当输入框内内容改变时触发函数来改变count值。

    (完)


  • AngularJS Service是一个函数或对象,可以使用在Angular应用中。

    AngularJS有很多内置服务,我们也可以按照自己的需要来创建服务,这里讲一下几个常用的服务。

    $HTTP

    $http服务是所有Angular服务中最为常用的内置服务之一。

    $http服务封装了浏览器原生的XMLHttpRequest对象。它只能接受一个参数,且这个参数是一个对象,包含了用来生成HTTP请求的配置内容。它返回一个Promise对象(一个原生的ES6对象,表示即将发生的事件),具有两个方法(success和error)。

    $http({
      url:'data.json',
      method:'GET'
    }).success(function(response){
      //响应成功
    }).error(function(response){
      //处理响应失败
    });
    

    使用than方法来处理回调

    $http({
      method: 'GET',
      url: 'data.js'
    }).then(function successCallback(response) {
      //响应成功
      }, function errorCallback(response) {
      //处理响应失败
    });
    

    快捷的GET/POST请求

    $http.get('date.json', config).then(successCallback, errorCallback);
    $http.post('date.json', data, config).then(successCallback, errorCallback);
    

    $location

    Angular中使用内置的$location服务来监听、操作URL,包括如下功能:

    • 获取、监听、改变地址栏的URL
    • 与URL实现双向数据绑定(地址栏变动、前进后退或者点击页面的链接均会触发)
    • 将URL对象封装成了一套方法(protocol、host、port、path、search和hash)

    $location服务的具体行为取决于它初始化时的配置。默认设置对大多数应用都是适合的,你也可以自定义配置来增加些新特性。

    $location服务初始化好以后,你就可以使用jquery风格的读写器和它交互了,你可以获取或者改变当前URL。

    $location服务的配置

    要配置$location服务,检索$locationProvider并把参数设置成以下这样:

    html5Mode(模式): {boolean}
      strue - 参阅HTML5模式
      false - 参阅Hashbang模式
      default: false
    hashPrefix(前缀): {string}
      Hashbang URLs的前缀 (在Hashbang模式中或者低级浏览器中使用)
      default: '!'
    

    配置示例

    $locationProvider.html5Mode(true).hashPrefix('!');
    

    Hashbang和HTML5模式

    $location服务有两种用来控制地址栏URL格式的配置:Hashbang模式(默认)和HTML5模式(使用HTML5历史API)。应用会使用两种模式中相同的API。

    示例

    Hashbang模式(默认mode)

    使用这个模式的话,$location会在所有浏览器中使用Hashbang URLs。

    it('should show example', inject(
      function($locationProvider) {
      $locationProvider.html5mode = false;
      $locationProvider.hashPrefix = '!';
      },
      function($location) {
      // open http://host.com/base/index.html#!/a
      $location.absUrl() == 'http://host.com/base/index.html#!/a'
      $location.path() == '/a'
      $location.path('/foo')
      $location.absUrl() == 'http://host.com/base/index.html#!/foo'
      $location.search() == {}
      $location.search({a: 'b', c: true});
      $location.absUrl() == 'http://host.com/base/index.html#!/foo?a=b&c'
      $location.path('/new').search('x=y');
      $location.absUrl() == 'http://host.com/base/index.html#!/new?x=y'
      }
    ));
    

    支持网络爬虫

    你需要添加特别的meta标记在你的文档的头部才能支持对你的AJAX应用的索引。

    <meta name="fragment" content="!" />
    

    这能让网络爬虫请求带有_escaped_fragment_形式的参数链接,这样你就能识别爬虫并且返回一个HTML的快照了。更多信息请参考 Making AJAX Applications Crawlable

    HTML5模式

    在HTML5模式中,$location服务的读写器和浏览器的URL地址通过HTML5历史API交互,这使你能用regular URL path并且搜索各组成部分,和hashbang是等效的。 如果浏览器不支持HTML5 历史API, $location服务会自动回退成使用hashbang URLs。你就不用担心浏览器的支持性了。$location服务总是会用最好的选择。

    • 在低级浏览器中使用了regular URL -> 重定向成hashbang URL
    • 在现代浏览器中打开了一个hashbang URL -> 重写成regular URL
    it('should show example', inject(
      function($locationProvider) {
      $locationProvider.html5mode = true;
      $locationProvider.hashPrefix = '!';
      },
      function($location) {
      // in browser with HTML5 history support:
      // open http://host.com/#!/a -> rewrite to http://host.com/a
      // (replacing the http://host.com/#!/a history record)
      $location.path() == '/a'
      $location.path('/foo');
      $location.absUrl() == 'http://host.com/foo'
      $location.search() == {}
      $location.search({a: 'b', c: true});
      $location.absUrl() == 'http://host.com/foo?a=b&c'
      $location.path('/new').search('x=y');
      $location.url() == 'new?x=y'
      $location.absUrl() == 'http://host.com/new?x=y'
      // in browser without html5 history support:
      // open http://host.com/new?x=y -> redirect to http://host.com/#!/new?x=y
      // (again replacing the http://host.com/new?x=y history item)
      $location.path() == '/new'
      $location.search() == {x: 'y'}
      $location.path('/foo/bar');
      $location.path() == '/foo/bar'
      $location.url() == '/foo/bar?x=y'
      $location.absUrl() == 'http://host.com/#!/foo/bar?x=y'
      }
    ));
    

    $cacheFactory

    $cacheFactory是应用程序一个会话(Session)中的缓存服务,以key-value对的方法存储一些临时数据。它跟浏览器本地缓存localStorage是不一样的。$cacheFactory在用户删除当前会话(比如强制刷新页面)之后,缓存的数据就被清空了。

    用法

    首先,要得到一个缓存实例,用id来区分,比如我想取id为’firstCache’的缓存:

    var cache = $cacheFactory('firstCache');
    

    添加kv对,put方法:

    cache.put(key, value);
    

    获取,get方法:

    cache.get(key); // 如果不存在这个key的话,会返回undefined
    

    添加kv对,put方法:

    cache.put(key, value);
    

    删除,remove和removeAll:

    cache.remove(key); // 删除某个kv对
    cache.removeAll(); // 删除该缓存的全部kv对
    

    删除该缓存实例,destroy:

    cache.destroy(); // 把当前缓存删除掉
    cache.put(key, value); // 错误!不能再访问该缓存,要重新生产一个实例出来
    

    $timeout、$interval

    $timeout和$interval是AngularJS自带的服务,跟原生js中的setTimeout和setInterval函数的用法基本是一样的。但是有两个不一样的地方需要注意一下:

    区别一:

    原生js中的两个函数,如果在AngularJS中使用并且在回调函数中需要使用$scope服务的话,我们需要用$angular.$apply把回调函数包起来,因为这里setTimeout函数被AngularJS当作是外部函数了。就像这样:

    // 错误的写法示例(使用setTimeout却没有用$apply):
    angular.module('myDemo', [])
      .controller('firstController', ['$scope', function ($scope) {
      setTimeout(function () {
        console.log('before');  // 正常输出before
        $scope.name = "My name have been changed."; // 这一句不被执行
        console.log('after');   // 正常输出after
      }, 2000);
      }]);
    
    // 正确的写法示例
    angular.module('myDemo', [])
      .controller('firstController', ['$scope', function ($scope) {
      setTimeout(function () {
        console.log('before');  // 正常输出before
        $scope.$apply(function () {
        $scope.name = "My name have been changed.";  // 正确显示
        });
        console.log('after');   // 正常输出after
      }, 2000);
      }]);
    

    所以,在AngularJS中,最好不要用setTimeout或setInterval,而是用那两个AngularJS系统服务。

    区别二:

    取消的方式不大一样,比如timeout:

    // setTimeout
    var id = setTimeout(func, 2000); // 返回该timeout的id
    clearTimeout(id); // 使用clearTimeout
    
    // $timeout服务
    var promise = $timeout(f, 2000); // 返回一个promise对象
    $timeout.cancel(promise); // 还是要使用服务,它的cancel方法
    

    $sce

    sce指的是Strict Contextual Escaping,它是默认开启的,负责拒绝一些不安全的行为,比如加载不同源的资源等等。但是有时候,我们又需要加载一些特定的资源,我们就得使用$sce的一些方法,来为这些资源和AngularJS系统之间建立信任。

    用法

    $sce有以下常用方法:

    • $sce.trustAsHtml(…):将一段html文本视为安全
    • $sce.trustAsUrl(…)
    • $sce.trustAsResourceUrl(…)
    • $sce.trustAsJs(…)

    举个例子,假如我要显示(可以理解成渲染,相当于android SDK中的WebView)一段html文本表示的内容,我们需要遵循以下步骤:

    1.在html模板中用“ng-bind-html”属性来绑定一个model(变量);

    2.在js中注入$sce服务,并且使用方法$sce.trustAsHtml(…),把信任后的值赋给该model。

    示例

    HTML:

    <div ng-controller="LogController">
      <!--这里不能用ng-bind,因为是渲染一段html文本,而不是显示简单的数据-->
      <div ng-bind-html="results"></div>
    </div>
    

    JS:

    angular.module('myDemo', [])
      .controller('LogController', function ($scope, $http, $sce) {
      // 随便定义一段html文本
      var txt = "<h1>Hello world!</h1>";
      // 这里不能直接$scope.results = txt,否则会报错显示“不安全”
      $scope.results = $sce.trustAsHtml(txt);
      });
    

    此时浏览器就会输出Hello world!

    (完)


  • controller是MVC(Model View Controller)框架中的一部分,(官方翻译)ngController指令是一个试图控制类,这是一个关键在angular如何支持模型视图控制器设计模式原则方面。Angular的控制器:ngController实际上是一个函数,指定一个Controller类,这个类控制业务逻辑和模型的在视图的绑定。

    我们来看一段代码:

      <div ng-app="myapp" ng-controller="myCtrl">
        输入的姓名:<br/>
        名:<input type="text" ng-model="firstname"/><br/>
        姓:<input type="text" ng-model="lastname"/>
        <br />
        <h1>hello {{ firstname +" "+ lastname }}</h1>
      </div>
      <script>
        var app = angular.module("myapp" ,[]);
        app.controller('myCtrl', function($scope) {
          $scope.firstname = "John";
          $scope.lastname =  "Doe";
        });
      </script>
    

    上面是一个最简单的使用ng-controller的实例

    ng-controller="myCtrl" 属性是一个 AngularJS 指令。用于定义一个控制器。

    myCtrl 函数是一个 JavaScript 函数。

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

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

    控制器在作用域中创建了两个属性 (firstName 和 lastName)。

    ng-model 指令绑定输入域到控制器的属性(firstName 和 lastName)。

    控制器也可以有方法

    我们将上面的例子改变一下:

      <div ng-app="myapp" ng-controller="personCtrl">
        输入的姓名: <br/>
        名:
        <input type="text" ng-model="firstname" /><br/> 姓:
        <input type="text" ng-model="lastname" />
        <br /> 这里使用函数的方式输出的姓名
        <h1>hello {{ fullname() }}</h1>
      </div>
      <script>
        var app = angular.module("myapp", []);
        app.controller('personCtrl', function ($scope) {
          $scope.firstname = "John";
          $scope.lastname = "Doe";
          $scope.fullname = function () {
            return $scope.firstname + " " + $scope.lastname;
          }
        });
      </script>
    

    这里我们使用调用函数的方式来输出姓名,将$scope.fullname绑定到HTML,这样修改input中的内容时,就可以看到全名被自动更新了。


  • 一、AngularJS模型

    • AngularJSng-model指令可以将输入域的值与 AngularJS 创建的变量绑定。
    • ng-model的绑定是双向绑定,即在一方修改变量,另一方也会立即同步。

    来看一个双向绑定的实例

    <div ng-app="myapp" ng-controller="myCtrl">
      输入:<input ng-model="name"><br/>
      当前name值是:<p>{{ name }}</p>
    </div>
    <script>
      var app = angular.module('myapp',[]);
       app.controller('myCtrl',function($scope){
         // 将输入域的值与 AngularJS 创建的变量绑定
        $scope.name = 'John Doe';
    });
    </script>
    

    Angular先是定义了name的值,并与input绑定,当你修改input的值时,Angular属性的值也会相应改变。

    验证用户输入

    来看一个实例,使用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):

    <form ng-app="" name="myForm" ng-init="myText = 'test@runoob.com'">
      Email:
      <input type="email" name="myAddress" ng-model="myText" required></p>
      <h1>状态</h1>
      {{myForm.myAddress.$valid}}
      {{myForm.myAddress.$dirty}}
      {{myForm.myAddress.$touched}}
    </form>
    

    CSS 类

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

    <style>
      input.ng-invalid {
        background-color: lightblue;
      }
    </style>
    <body>
      <form ng-app="" name="myForm">
        输入你的名字:
        <input name="myAddress" ng-model="text" required>
      </form>
    

    上面的实例,设置了input框未输入的背景颜色

    ng-model 指令根据表单域的状态添加/移除以下类:(具体参考:AngularJS: API: form

    • ng-empty
    • ng-not-empty
    • ng-touched
    • ng-untouched
    • ng-valid
    • ng-invalid
    • ng-dirty
    • ng-pending
    • ng-pristine

    二、AngularJS作用域

    • Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。
    • Scope 是一个对象,有可用的方法和属性。
    • Scope 可应用在视图和控制器上。

    如何使用 Scope

    当你在 AngularJS 创建控制器时,你可以将 $scope 对象当作一个参数传递:

      <div ng-app="myApp" ng-controller="myCtrl">
        <h1>{{carname}}</h1>
      </div>
      <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
          $scope.carname = "Volvo";
        });
      </script>
    

    当在控制器中添加 $scope 对象时,视图 (HTML) 可以获取了这些属性。

    视图中,你不需要添加 $scope 前缀, 只需要添加属性名即可,如: {{carname}}。

    Scope 概述

    AngularJS 应用组成如下:

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

    scope 是模型。

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

      <div ng-app="myApp" ng-controller="myCtrl">
        <input ng-model="name">
        <h1>{{greeting}}</h1>
        <button ng-click='sayHello()'>点我</button>
      </div>
      <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
          $scope.name = "Runoob";
          $scope.sayHello = function () {
            $scope.greeting = 'Hello ' + $scope.name + '!';
          };
        });
      </script>
    

    Scope 作用范围

    了解你当前使用的 scope 是非常重要的。

    在以上两个实例中,只有一个作用域 scope,所以处理起来比较简单,但在大型项目中, HTML DOM 中有多个作用域,这时你就需要知道你使用的 scope 对应的作用域是哪一个。

      <div ng-app="myApp" ng-controller="myCtrl">
        <ul>
          <li ng-repeat="x in names">{{x}}</li>
        </ul>
      </div>
      <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
          $scope.names = ["Emil", "Tobias", "Linus"];
        });
      </script>
    

    每个 <li> 元素可以访问当前的重复对象,这里对应的是一个字符串, 并使用变量 x 表示。

    根作用域

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

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

       <div ng-app="myApp" ng-controller="myCtrl">
        <h1>{{lastname}} 家族成员:</h1>
        <ul>
          <li ng-repeat="x in names">{{x}} {{lastname}}</li>
        </ul>
      </div>
      <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope, $rootScope) {
          $scope.names = ["Emil", "Tobias", "Linus"];
          $rootScope.lastname = "Refsnes";
        });
      </script>
    

  • 一、AngularJS表达式

    • AngularJS的表达式写在双括号{{}}
    • 表达式的作用是将绑定的数据输出到HTML页面

    看下面这段代码

    <div ng-app="">
      <!-- 表达式写在双大括号内 数据绑定 -->
      <!-- angluarjs的表达式类似于js的表达式 可以包含文字 运算符 变量 -->
      {{ 5+5 }} // 输出: 10
    </div>
    

    表达式可以输出数字:

    <div ng-app="" ng-init="quantity=1;cost=5">
      <p>总价: {{ quantity * cost }}</p>
    </div>
    

    也可以输出字符串:

    <div ng-app="" ng-init="firstName='John';lastName='Doe'">
      <p>姓名: {{ firstName + " " + lastName }}</p>
    </div>
    

    也可以输出对象:

    <div ng-app="" ng-init="person={firstName:'John',lastName:'Doe'}">
      <p>姓为 {{ person.lastName }}</p>
    </div>
    

    输出数组:

    <div ng-app="" ng-init="points=[1,15,19,2,40]">
      <p>第三个值为 {{ points[2] }}</p>
    </div>
    

    二、AngularJS指令

    • AngularJS 指令是扩展的 HTML 属性,带有前缀ng-
    • ng-app 指令初始化一个 AngularJS 应用程序。
    • ng-init 指令初始化应用程序数据。
    • ng-model 指令把元素值(比如输入域的值)绑定到应用程序。

    看一个数据绑定的实例:

    <div ng-app="" ng-init="firstName='John'">
       <p>在输入框中尝试输入:</p>
       <p>姓名:<input type="text" ng-model="firstName"></p>
       <p>你输入的为: {{ firstName }}</p>
    </div>
    

    上面实例中的 {{ firstName }} 表达式是一个 AngularJS 数据绑定表达式。

    AngularJS 中的数据绑定,同步了 AngularJS 表达式与 AngularJS 数据。

    {{ firstName }} 是通过 ng-model="firstName" 进行同步。

    重复 HTML 元素

    ng-repeat 指令会重复一个 HTML 元素:

    <div ng-app="" ng-init="names=['Jani','Hege','Kai']">
      <p>使用 ng-repeat 来循环数组</p>
      <ul>
      <li ng-repeat="x in names">
        {{ x }}
      </li>
      </ul>
    </div>
    

    ng-repeat 指令用在一个对象数组上:

    <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>
    

    创建自定义的指令

    除了 AngularJS 内置的指令外,我们还可以创建自定义指令。

    你可以使用 .directive 函数来添加自定义的指令。

    要调用自定义指令,HTML 元素上需要添加自定义指令名。

    使用驼峰法来命名一个指令, customizeDirective, 但在使用它时需要以 – 分割, customize-directive:

    <body ng-app="myApp">
      <customize-directive></customize-directive>
      <script>
        var app = angular.module("myApp", []);
        app.directive("customizeDirective", function() {
          return {
            template : "<h1>自定义指令!</h1>"
          };
        });
      </script>
    </body>