沉淀,再出发:AngularJS初探

沉淀,再出发:AngularJS初探

一、前言

    知识的学习需要形成一个闭环,在这个闭环之内可以自圆其说,从而触类旁通,加以理想创造,从而产生灵感。关于前端的知识,我已经写得差不多了,但是还有一个知识点AngularJS没有说过,那么为什么会出现这个技术呢,是解决什么问题呢?让我们来看一下。

二、AngularJS本质

   2.1、什么是AngularJS?

    AngularJS 通过新的属性和表达式扩展了 HTML。AngularJS 可以构建一个单一页面应用程序(SPAs:Single Page Applications)。AngularJS 学习起来非常简单。AngularJS 是比较新的技术,版本 1.0 是在 2012 年发布的,AngularJS 是由 Google 的员工 Miško Hevery 从 2009 年开始着手开发。这是一个非常好的构想,该项目目前已由 Google 正式支持,有一个全职的开发团队继续开发和维护这个库。
    AngularJS 是一个 JavaScript 框架。它是一个以 JavaScript 编写的库。AngularJS 是以一个 JavaScript 文件形式发布的,可通过 script 标签添加到网页中。AngularJS 通过指令扩展了 HTML,且通过表达式绑定数据到 HTML。
    AngularJS 是专门为应用程序设计的 HTML。

1     AngularJS 把应用程序数据绑定到 HTML 元素。
2     AngularJS 可以克隆和重复 HTML 元素。
3     AngularJS 可以隐藏和显示 HTML 元素。
4     AngularJS 可以在 HTML 元素"背后"添加代码。
5     AngularJS 支持输入验证。

   AngularJS 通过 ng-directives 扩展了 HTML。

1    ng-app 指令定义一个 AngularJS 应用程序。
2    ng-model 指令把元素值(比如输入域的值)绑定到应用程序。
3    ng-bind 指令把应用程序数据绑定到 HTML 视图。
4    ng-init 指令初始化 AngularJS 应用程序变量。

   实例如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <div ng-app="">
 9     <p>在输入框中尝试输入:</p>
10     <p>姓名:<input type="text" ng-model="name"></p>
11     <p ng-bind="name"></p>
12     </div>
13 
14     <script src="https://libs.baidu.com/angular.js/1.2.5/angular.min.js"></script>
15 </body>
16 </html>

   HTML5 允许扩展的(自制的)属性,以 data- 开头。AngularJS 属性以 ng- 开头,但是可以使用 data-ng- 来让网页对 HTML5 有效。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <div data-ng-app="" data-ng-init="firstName='John'">
 9     <p>姓名为 <span data-ng-bind="firstName"></span></p>
10     </div>
11     <script src="https://libs.baidu.com/angular.js/1.2.5/angular.min.js"></script>
12 </body>
13 </html>

  2.2、AngularJS 表达式

1 AngularJS 表达式写在双大括号内:{{ expression }}。
2 AngularJS 表达式把数据绑定到 HTML,这与 ng-bind 指令有异曲同工之妙。
3 AngularJS 将在表达式书写的位置"输出"数据。
4 AngularJS 表达式 很像 JavaScript 表达式:它们可以包含文字、运算符和变量。

AngularJS 实例:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8 
 9     <div ng-app="">
10       <p>我的第一个表达式: {{ 5 + 5 }}</p>
11     </div>
12     <script src="https://libs.baidu.com/angular.js/1.2.5/angular.min.js"></script>
13 </body>
14 </html>

   AngularJS 数字、字符串、实例、对象、数组和JavaScript 类似。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <div ng-app="" ng-init="quantity=1;cost=5">
 9     <p>总价: {{ quantity * cost }}</p>
10     </div>
11 <!-- 
12     <div id='m2' ng-app="m2" ng-init="quantity=1;cost=5">
13     <p>总价: <span ng-bind="quantity * cost"></span></p>
14     </div>
15 
16     <div ng-app="" ng-init="firstName='John';lastName='Doe'">
17     <p>姓名: {{ firstName + " " + lastName }}</p>
18     </div>
19 
20     <div ng-app="" ng-init="firstName='John';lastName='Doe'">
21     <p>姓名: <span ng-bind="firstName + ' ' + lastName"></span></p>
22     </div>
23 
24     <div ng-app="" ng-init="person={firstName:'John',lastName:'Doe'}">
25     <p>姓为 {{ person.lastName }}</p>
26     </div>
27 
28     <div ng-app="" ng-init="person={firstName:'John',lastName:'Doe'}">
29     <p>姓为 <span ng-bind="person.lastName"></span></p>
30     </div>
31 
32     <div ng-app="" ng-init="points=[1,15,19,2,40]">
33     <p>第三个值为 {{ points[2] }}</p>
34     </div>
35 
36     <div ng-app="" ng-init="points=[1,15,19,2,40]">
37     <p>第三个值为 <span ng-bind="points[2]"></span></p>
38     </div>  
39  -->
40 
41     <script src="https://libs.baidu.com/angular.js/1.2.5/angular.min.js"></script>
42 </body>
43 </html>

      在AngularJS学习中,对于ng-app初始化一个AngularJS程序属性的使用需要注意,在一个页面中AngularJS自动加载第一个ng-app,其他ng-app会忽略。

    2.3、AngularJS 指令

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

1 <div ng-app="" ng-init="quantity=1;price=5">
2 <h2>价格计算器</h2>
3 数量: <input type="number" ng-model="quantity">
4 价格: <input type="number" ng-model="price">
5 <p><b>总价:</b> {{ quantity * price }}</p>
6 </div>

  

   重复 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 指令用在一个对象数组上:

 1     <div ng-app="" ng-init="names=[
 2         {name:'Jani',country:'Norway'},
 3         {name:'Hege',country:'Sweden'},
 4         {name:'Kai',country:'Denmark'}]">
 5         <p>循环对象:</p>
 6         <ul>
 7         <li ng-repeat="x in names">
 8         {{ x.name + ', ' + x.country }}
 9         </li>
10         </ul>
11     </div>


    AngularJS 完美支持数据库的 CRUD(增加Create、读取Read、更新Update、删除Delete)应用程序。

 1 ng-app 指令
 2     ng-app 指令定义了 AngularJS 应用程序的 根元素。
 3     ng-app 指令在网页加载完毕时会自动引导(自动初始化)应用程序。
 4 
 5 ng-init 指令
 6     ng-init 指令为 AngularJS 应用程序定义了初始值。通常情况下,不使用 ng-init。您将使用一个控制器或模块来代替它。
 7 
 8 ng-model 指令
 9     ng-model 指令绑定 HTML 元素 到应用程序数据。
10     为应用程序数据提供类型验证(number、email、required)。
11     为应用程序数据提供状态(invalid、dirty、touched、error)。
12     为 HTML 元素提供 CSS 类。
13     绑定 HTML 元素到 HTML 表单。
14 
15 ng-repeat 指令
16     ng-repeat 指令对于集合中(数组中)的每个项会 克隆一次 HTML 元素。

   2.4、AngularJS 控制器

     AngularJS 控制器控制 AngularJS 应用程序的数据,是常规的 JavaScript 对象。ng-controller 指令定义了应用程序控制器。控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数创建。控制器的 $scope 是控制器所指向的应用程序 HTML 元素。

 1     <div ng-app="" ng-controller="personController">
 2         名: <input type="text" ng-model="person.firstName"><br>
 3         姓: <input type="text" ng-model="person.lastName"><br>
 4         <br>
 5         姓名: {{person.firstName + " " + person.lastName}}
 6     </div>
 7     <script>
 8         function personController($scope) {
 9             $scope.person = {
10                 firstName: "John",
11                 lastName: "Doe"
12             };
13         }
14     </script>

1 AngularJS 应用程序由 ng-app 定义。应用程序在 <div> 内运行。
2 ng-controller 指令把控制器命名为 object。
3 函数 personController 是一个标准的 JavaScript 对象的构造函数。
4 控制器对象有一个属性:$scope.person。
5 person 对象有两个属性:firstName 和 lastName。
6 ng-model 指令绑定输入域到控制器的属性(firstName 和 lastName)。

      控制器也可以把函数作为对象属性:

 1     <div ng-app="" ng-controller="personController">
 2         名: <input type="text" ng-model="person.firstName"><br>
 3         姓: <input type="text" ng-model="person.lastName"><br>
 4         <br>
 5         姓名: {{person.fullName()}}
 6     </div>
 7     <script>
 8         function personController($scope) {
 9             $scope.person = {
10                 firstName: "John",
11                 lastName: "Doe",
12                 fullName: function() {
13                     var x;
14                     x = $scope.person;
15                     return x.firstName + " " + x.lastName;
16                 }
17             };
18         }
19     </script>


   控制器也可以带有方法:

 1     <div ng-app="" ng-controller="personController">
 2         名: <input type="text" ng-model="person.firstName"><br>
 3         姓: <input type="text" ng-model="person.lastName"><br>
 4         <br>
 5         姓名: {{fullName()}}
 6     </div>
 7 
 8     <script>
 9         function personController($scope) {
10             $scope.person = {
11                 firstName: "John",
12                 lastName: "Doe",
13              };
14              $scope.fullName = function() {
15                  var x;
16                  x = $scope.person;
17                  return x.firstName + " " + x.lastName;
18              };
19         }
20     </script>


    外部文件中的控制器
    在大型的应用程序中,通常是把控制器存储在外部文件中。只需要把 <script> 标签中的代码复制到名为 personController.js 的外部文件中即可:

1     <div ng-app="" ng-controller="personController">
2         名: <input type="text" ng-model="person.firstName"><br>
3         姓: <input type="text" ng-model="person.lastName"><br>
4         <br>
5         姓名: {{person.firstName + " " + person.lastName}}
6     </div>
7     <script src="personController.js"></script>



   下面的实例我们将创建一个新的控制器文件:


    2.5、过滤器

   AngularJS 过滤器可用于转换数据:

1 过滤器                   描述
2 currency          格式化数字为货币格式。
3 filter            从数组项中选择一个子集。
4 lowercase         格式化字符串为小写。
5 orderBy           根据某个表达式排列数组。
6 uppercase         格式化字符串为大写。

   过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中。
   uppercase 过滤器格式化字符串为大写,
   lowercase 过滤器格式化字符串为小写,
   currency 过滤器格式化数字为货币格式:

1 <div ng-app="" ng-controller="personController">
2    <p>姓名为 {{ person.lastName | uppercase }}</p>
3    <p>姓名为 {{ person.lastName | lowercase }}</p>
4    数量:<input type="number" ng-model="quantity">
5    价格:<input type="number" ng-model="price">
6    <p>总价 = {{ (quantity * price) | currency }}</p>
7 </div>


   过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中。

   orderBy 过滤器根据某个表达式排列数组,输入过滤器可以通过一个管道字符(|)和一个过滤器添加到指令中,该过滤器后跟一个冒号和一个模型名称。

 1     <div ng-app="" ng-controller="namesController">
 2         <p>循环对象:</p>
 3         <ul>
 4           <li ng-repeat="x in names | orderBy:'country'">
 5             {{ x.name + ', ' + x.country }}
 6           </li>
 7         </ul>
 8         <br>
 9         <p>输入过滤:</p>
10         <p><input type="text" ng-model="name"></p>
11         <ul>
12           <li ng-repeat="x in names | filter:name | orderBy:'country'">
13             {{ (x.name | uppercase) + ', ' + x.country }}
14           </li>
15         </ul>
16     <div>

   2.6、$http

     $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。以下是存储在web服务器上的 JSON 文件:

<?php header("Access-Control-Allow-Origin: *"); ?>


[
{
"Name" : "Alfreds Futterkiste",
"City" : "Berlin",
"Country" : "Germany"
},
{
"Name" : "Berglunds snabbköp",
"City" : "Luleå",
"Country" : "Sweden"
},
{
"Name" : "Centro comercial Moctezuma",
"City" : "México D.F.",
"Country" : "Mexico"
},
{
"Name" : "Ernst Handel",
"City" : "Graz",
"Country" : "Austria"
},
{
"Name" : "FISSA Fabrica Inter. Salchichas S.A.",
"City" : "Madrid",
"Country" : "Spain"
},
{
"Name" : "Galería del gastrónomo",
"City" : "Barcelona",
"Country" : "Spain"
},
{
"Name" : "Island Trading",
"City" : "Cowes",
"Country" : "UK"
},
{
"Name" : "Königlich Essen",
"City" : "Brandenburg",
"Country" : "Germany"
},
{
"Name" : "Laughing Bacchus Wine Cellars",
"City" : "Vancouver",
"Country" : "Canada"
},
{
"Name" : "Magazzini Alimentari Riuniti",
"City" : "Bergamo",
"Country" : "Italy"
},
{
"Name" : "North/South",
"City" : "London",
"Country" : "UK"
},
{
"Name" : "Paris spécialités",
"City" : "Paris",
"Country" : "France"
},
{
"Name" : "Rattlesnake Canyon Grocery",
"City" : "Albuquerque",
"Country" : "USA"
},
{
"Name" : "Simons bistro",
"City" : "København",
"Country" : "Denmark"
},
{
"Name" : "The Big Cheese",
"City" : "Portland",
"Country" : "USA"
},
{
"Name" : "Vaffeljernet",
"City" : "Århus",
"Country" : "Denmark"
},
{
"Name" : "Wolski Zajazd",
"City" : "Warszawa",
"Country" : "Poland"
}
]
myjson.php
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <div ng-app="" ng-controller="customersController">
 9         <ul>
10             <li ng-repeat="x in names">
11                 {{ x.Name + ', ' + x.Country }}
12             </li>
13         </ul>
14     </div>
15     <script>
16         function customersController($scope,$http) {
17             $http.get("http://localhost/zyr_project/myjson.php")
18             .success(function(response) {$scope.names = response;});
19         }
20     </script>
21     <script src="https://libs.baidu.com/angular.js/1.2.5/angular.min.js"></script>
22 </body>
23 </html>

三、总结

     可以看到angularjs对于单个页面的数据操纵,过滤,控制,单个元素的强大的处理能力,并且还能和远程交互完成一些任务,非常的方便。

原文地址:https://www.cnblogs.com/zyrblog/p/9673404.html