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 应用组成如下:

  1. View(视图), 即 HTML。
  2. Model(模型), 当前视图中可用的数据。
  3. 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. 控制器

    1. AngularJS 控制器 控制 AngularJS 应用程序的数据。

    2. 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的作用域问题

    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> //ctrl局部first
    {{$root.first}}<br> //全局first
    {{second}}<br> //全局second
    {{$root.second}}<br> //全局second
    </div>
    <br>
    <br>
    <div ng-controller="myCtrl2">
    {{first}}<br> //全局first
    {{$root.first}}<br> //全局first
    {{second}}<br> //ctrl2局部second
    {{$root.second}} //全局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 }}   // 结果:LOWER CAP STRING
    {{ "TANK is GOOD" | lowercase }} // 结果:tank is good

    2、date 格式化

    1
    {{1490161945000 | date:"yyyy-MM-dd HH:mm:ss"}} // 2017-03-22 13:52:25

    3、number 格式化(保留小数)

    1
    {{149016.1945000 | number:2}}

    4、currency货币格式化

    1
    2
    {{ 250 | currency }}            // 结果:$250.00
    {{ 250 | currency:"RMB ¥ " }} // 结果:RMB ¥ 250.00

    5、filter查找

    输入过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中,该过滤器后跟一个冒号和一个模型名称。

    filter 过滤器从数组中选择一个子集

    1
    2
    3
    4
    5
     // 查找name为iphone的行
    {{ [{"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}} // 从前面开始截取6位
    {{"1234567890" | limitTo:-4}} // 从后面开始截取4位

    7、orderBy 排序

    1
    2
    3
    4
    5
     // 根id降序排
    {{ [{"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
    // 根据id升序排
    {{ [{"age": 20,"id": 10,"name": "iphone"},
    {"age": 12,"id": 11,"name": "sunm xing"},
    {"age": 44,"id": 12,"name": "test abc"}
    ] | orderBy:'id' }}
  • 评论