1. Angular模型
1.1 ng-model指令
ng-model 指令可以将输入域的值与 AngularJS 创建的变量绑定。
1 2 3 4 5 6 7 8 9 10
| <div ng-app="myApp" ng-controller="myCtrl"> 名字: <input ng-model="name"> </div>
<script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope) { $scope.name = "John Doe"; }); </script>
|
1.2 双向绑定
双向绑定,在修改输入域的值时, AngularJS 属性的值也将修改:
1 2 3 4 5 6 7 8 9 10 11
| <div ng-app="myApp" ng-controller="myCtrl"> 名字: <input ng-model="name"> <h1>你输入了: {{name}}</h1> </div>
<script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope) { $scope.name = "John Doe"; }); </script>
|
1.3 验证用户输入
1 2 3 4 5
| <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 的情况下显示。
1.4 应用状态
ng-model 指令可以为应用数据提供状态值(invalid, dirty, touched, error):
1 2 3 4 5 6 7 8
| <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>
|
1.5 css类
ng-model 指令基于它们的状态为 HTML 元素提供了 CSS 类:
1 2 3 4 5 6 7 8 9 10 11
| <style> input.ng-invalid { background-color: lightblue; } </style> <body>
<form ng-app="" name="myForm"> 输入你的名字: <input name="myAddress" ng-model="text" required> </form>
|
1.6 补充笔记
ng-invalid:未通过验证的表单
ng-valid:布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为true
ng-dirty:布尔值属性,表示用户是否修改了表单。如果为 ture,表示有修改过;false 表示修没有修改过
ng-touched:布尔值属性,表示用户是否和控件进行过交互
ng-pristine:布尔值属性,表示用户是否修改了表单。如果为ture,表示没有修改过;false表示修改过
2. Scope作用域
Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。
Scope 是一个对象,有可用的方法和属性。
Scope 可应用在视图和控制器上。
2.1 如何使用?
当你在 AngularJS 创建控制器时,你可以将 $scope
对象当作一个参数传递:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <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>
|
AngularJS 应用组成如下:
- View(视图), 即 HTML。
- Model(模型), 当前视图中可用的数据。
- Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <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>
|
2.2 Scope作用范围
了解你当前使用的 scope 是非常重要的。
在以上两个实例中,只有一个作用域 scope,所以处理起来比较简单,但在大型项目中, HTML DOM 中有多个作用域,这时你就需要知道你使用的 scope 对应的作用域是哪一个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <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>
|
每个
元素可以访问当前的重复对象,这里对应的是一个字符串, 并使用变量 x 表示。
2.3 根作用域
所有的应用都有一个 $rootScope
,它可以作用在 ng-app 指令包含的所有 HTML 元素中。
$rootScope
可作用于整个应用中。是各个 controller 中 scope 的桥梁。用 rootscope 定义的值,可以在各个 controller 中使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <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>
|
3. 控制器
AngularJS 控制器 控制 AngularJS 应用程序的数据。
AngularJS 控制器是常规的 JavaScript 对象。
3.1 AngularJS 控制器
AngularJS 应用程序被控制器控制。
ng-controller 指令定义了应用程序控制器。
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <div ng-app="myApp" ng-controller="myCtrl">
名: <input type="text" ng-model="firstName"><br> 姓: <input type="text" ng-model="lastName"><br> <br> 姓名: {{firstName + " " + lastName}}
</div>
<script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope) { $scope.firstName = "John"; $scope.lastName = "Doe"; }); </script>
|
解释:
AngularJS 应用程序由 ng-app 定义。应用程序在 <div>
内运行。
ng-controller=”myCtrl” 属性是一个 AngularJS 指令。用于定义一个控制器。
myCtrl 函数是一个 JavaScript 函数。
AngularJS 使用$scope
对象来调用控制器。
在 AngularJS 中, $scope
是一个应用对象(属于应用变量和函数)。
控制器的 $scope
(相当于作用域、控制范围)用来保存AngularJS Model(模型)的对象。
控制器在作用域中创建了两个属性 (firstName 和 lastName)。
ng-model 指令绑定输入域到控制器的属性(firstName 和 lastName)。
3.2 控制器方法
上面的实例演示了一个带有 lastName 和 firstName 这两个属性的控制器对象。
控制器也可以有方法(变量和函数):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div ng-app="myApp" ng-controller="personCtrl">
名: <input type="text" ng-model="firstName"><br> 姓: <input type="text" ng-model="lastName"><br> <br> 姓名: {{fullName()}}
</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>
|
3.3 外部文件中的控制器
在大型的应用程序中,通常是把控制器存储在外部文件中。
只需要把 <script>
标签中的代码复制到名为 personController.js 的外部文件中即可:
1 2 3 4 5 6 7 8 9 10
| <div ng-app="myApp" ng-controller="personCtrl">
First Name: <input type="text" ng-model="firstName"><br> Last Name: <input type="text" ng-model="lastName"><br> <br> Full Name: {{firstName + " " + lastName}}
</div>
<script src="personController.js"></script>
|
1 2 3 4 5 6 7
| angular.module('myApp', []).controller('namesCtrl', function($scope) { $scope.names = [ {name:'Jani',country:'Norway'}, {name:'Hege',country:'Sweden'}, {name:'Kai',country:'Denmark'} ]; });
|
保存文件为 namesController.js:
然后,在应用中使用控制器文件:
1 2 3 4 5 6 7 8 9 10 11
| <div ng-app="myApp" ng-controller="namesCtrl">
<ul> <li ng-repeat="x in names"> {{ x.name + ', ' + x.country }} </li> </ul>
</div>
<script src="namesController.js"></script>
|
3.4 笔记
controller 中,如果局部 $scope
和 $rootScope
都存在,且有相同名字的变量, 指局部变量而不是全局变量,作用域只有当前 controller; 是全局变量,在 ng-app=”” 下任何一个 controller 中都能使用。如果没有 $scope
, 只有 $rootScope
,那么 和 就没区别了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <body ng-app="myApp"> <div ng-controller="myCtrl"> {{first}}<br> {{$root.first}}<br> {{second}}<br> {{$root.second}}<br> </div> <br> <br> <div ng-controller="myCtrl2"> {{first}}<br> {{$root.first}}<br> {{second}}<br> {{$root.second}} </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function ($scope,$rootScope) { $scope.first = 'ctrl局部first'; $rootScope.first = '全局first'; }); app.controller('myCtrl2', function ($scope,$rootScope) { $scope.second = 'ctrl2局部second'; $rootScope.second = '全局second'; }); </script>
|
4. 过滤器
过滤器可以使用一个管道字符(|)添加到表达式和指令中。
4.1 AngularJS 过滤器
AngularJS 过滤器可用于转换数据:
过滤器 |
描述 |
currency |
格式化数字为货币格式 |
filter |
从数组项中选择一个子集 |
lowercase |
格式化字符串为小写 |
orderBy |
根据某个表达式排列数组 |
uppercase |
格式化字符串为大写 |
4.2 表达式中添加过滤器
过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中。
(下面的两个实例,我们将使用前面章节中提到的 person 控制器)
uppercase 过滤器将字符串格式化为大写:
1 2 3 4 5
| <div ng-app="myApp" ng-controller="personCtrl">
<p>姓名为 {{ lastName | uppercase }}</p>
</div>
|
lowercase 过滤器将字符串格式化为小写:
1 2 3 4 5
| <div ng-app="myApp" ng-controller="personCtrl">
<p>姓名为 {{ lastName | lowercase }}</p>
</div>
|
currency 过滤器
currency 过滤器将数字格式化为货币格式:
1 2 3 4 5 6 7 8
| <div ng-app="myApp" ng-controller="costCtrl">
<input type="number" ng-model="quantity"> <input type="number" ng-model="price">
<p>总价 = {{ (quantity * price) | currency }}</p>
</div>
|
4.3 向指令添加过滤器
过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中。
orderBy 过滤器根据表达式排列数组:
1 2 3 4 5 6 7 8 9
| <div ng-app="myApp" ng-controller="namesCtrl">
<ul> <li ng-repeat="x in names | orderBy:'country'"> {{ x.name + ', ' + x.country }} </li> </ul>
</div>
|
4.4 过滤输入
输入过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中,该过滤器后跟一个冒号和一个模型名称。
filter 过滤器从数组中选择一个子集:
1 2 3 4 5 6 7 8 9 10 11
| <div ng-app="myApp" ng-controller="namesCtrl">
<p><input type="text" ng-model="test"></p>
<ul> <li ng-repeat="x in names | filter:test | orderBy:'country'"> {{ (x.name | uppercase) + ', ' + x.country }} </li> </ul>
</div>
|
4.5 自定义过滤器
以下实例自定义一个过滤器 reverse,将字符串反转:
1 2 3 4 5 6 7 8 9
| var app = angular.module('myApp', []); app.controller('myCtrl', function($scope) { $scope.msg = "Runoob"; }); app.filter('reverse', function() { return function(text) { return text.split("").reverse().join(""); } });
|
4.6 笔记
1、uppercase,lowercase 大小写转换
1 2
| {{ "lower cap string" | uppercase }} {{ "TANK is GOOD" | lowercase }}
|
2、date 格式化
1
| {{1490161945000 | date:"yyyy-MM-dd HH:mm:ss"}}
|
3、number 格式化(保留小数)
1
| {{149016.1945000 | number:2}}
|
4、currency货币格式化
1 2
| {{ 250 | currency }} {{ 250 | currency:"RMB ¥ " }}
|
5、filter查找
输入过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中,该过滤器后跟一个冒号和一个模型名称。
filter 过滤器从数组中选择一个子集
1 2 3 4 5
| {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | filter:{'name':'iphone'} }}
|
6、limitTo 截取
1 2
| {{"1234567890" | limitTo :6}} {{"1234567890" | limitTo:-4}}
|
7、orderBy 排序
1 2 3 4 5
| {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | orderBy:'id':true }}
|
1 2 3 4 5
| {{ [{"age": 20,"id": 10,"name": "iphone"}, {"age": 12,"id": 11,"name": "sunm xing"}, {"age": 44,"id": 12,"name": "test abc"} ] | orderBy:'id' }}
|