AngularJS 指令是擴展的 HTML 屬性,帶有前綴 ng-。php
好比:angularjs
ng-app 指令初始化一個 AngularJS 應用程序。注意ng-app通常爲空,若是值不爲空,就得加這樣一句代碼var app = angular.module('名字', []);服務器
ng-init 指令初始化應用程序數據。app
這個在以前已經說過了,下面講一下以前沒講到的。函數
ng-repeat指令與ng-options指令ui
<!--通常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也能夠實現下拉框。this
<select ng-model="selectedSite"> <option ng-repeat="x in sites" value="{{x.site}}">{{x.site}}</option> </select>
利用ng-model指令不只能夠雙向綁定控件到AngularJS應用程序的變量,還能夠用來驗證數據有效性spa
<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):rest
<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; }
字面意思相信已經足夠理解了,這就用來根據輸入框的各類情況來顯現相應的樣式。
自定義指令
<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 應用組成以下:
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>