AngularJs

AngularJs简介

简介与安装

简介

AngularJS 是JavaScript的 一个框架。它是JavaScript 编写的一个库。是AngularJS为了克服HTML在构建应用上的不足而设计的。HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了。

**AngularJS通过使用我们称为标识符(directives)的结构,让浏览器能够识别新的语法。**例如:

1)使用双大括号{{}}语法进行数据绑定;

2)使用DOM控制结构来实现迭代或者隐藏DOM片段;

3) 支持表单和表单的验证;

4)能将逻辑代码关联到相关的DOM元素上;

5)能将HTML分组成可重用的组件。

关于AngularJS的特点:

1)数据的双向绑定,这可能是其最激动人心的特性,view层的数据和model层的数据是双向绑定的,其中之一发生更改,另一方会随之变化,而不需要写任何代码;

2)代码模块化,每个模块的代码独立且拥有自己的作用域,比如model,controller等;

3)强大的directive,可以将很多功能封装成HTML的tag,属性或者注释等,这大大美化了HTML的结构,增强了可阅读性;

4)依赖注入,将这种后端语言的设计模式赋予前端代码,这意味着前端的代码可以提高重用性和灵活性,未来的模式可能将大量操作放在客户端,服务端只提供数据来源和其它客户端无法完成的操作;

5)测试驱动开发,使用Angular开发的应用可以很容易地进行单元测试和端对端测试,这解决了传统的JS代码难以测试和维护的缺陷。

安装

AngularJS下载

1)AngularJS下载地址:

0.jpg

https://angularjs.org/

https://github.com/angular/angular.js/releases

2)安装与使用(CDN方式)

创建AngularJS的一个简单应用程序“Hello World!”:

使用编辑器,创建一个HTML文件,例如:helloworld.html。

将下面的源代码复制到您的HTML文件。

源码:

<!doctype html>
<html ng-app>
    <head>
        <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    </head>
    <body>
        Hello {{'World'}}!
    </body>
</html>

在web浏览器中打开这个HTML文件。

代码说明:

1)当加载该页时,标记ng-app告诉AngularJS处理整个HTML页并引导应用:

2)这行载入AngularJS脚本:

<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>

3)标签中的正文是应用的模板,在UI中显示问候语:

Hello {{'World'}}!

*注意:使用双大括号标记{{}}的内容是问候语中绑定的表达式,这个表达式是一个简单的字符串‘World’。

AngularJS应用场景

AngularJS主要考虑的是构建CRUD(增加Create、查询Retrieve、更新Update、删除Delete)应用。幸运的是,至少90%的WEB应用都是CRUD应用。

如果你要开发的是单页应用,AngularJS就是你的上上之选。Gmail、Google Docs、Twitter和Facebook这样的应用,都很能发挥AngularJS的长处。

但是像游戏开发之类对DOM进行大量操作、又或者单纯需要极高运行速度的应用,就不适合使用AngularJS了。

实现效果

在下图中,表单验证使用了AngularJS特性中的双向数据绑定MVC依赖注入

表单验证.png

页面跳转中使用了AngularJS特性中的路由控制,说白了路由就是为了页面跳转的,在web应用中路由可以将应用的所有页面缓存,从而加快页面跳转的速度。

路由.png

eg.

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>路由配置对象</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
    <script type="text/javascript">
        angular.module('ngRouteExample', ['ngRoute'])
            .controller('HomeController', function ($scope) {
                $scope.$route = $route;
            })
            .controller('AboutController', function ($scope) {
                $scope.$route = $route;
            })
            .config(function ($routeProvider) {
                $routeProvider.
                when('/home', {
                    templateUrl: 'embedded.home.html',
                    controller: 'HomeController'
                }).
                when('/about', {
                    templateUrl: 'embedded.about.html',
                    controller: 'AboutController'
                }).
                otherwise({
                    redirectTo: '/home'
                });
            });
    </script>
    <style type="text/css">
        a:link,
        a:visited {
            text-decoration: none;
            /*超链接无下划线*/
            color:black;
        }
    </style>
</head>

<body ng-app="ngRouteExample" class="ng-scope">
    <script type="text/ng-template" id="embedded.home.html">
        <h1> 首页 </h1>
    </script>
    <script type="text/ng-template" id="embedded.about.html">
        <h1>关于我们 </h1>
    </script>
    <div>
        <div id="navigation">
            <a href="#/home">首页</a>
            <a href="#/about">关于我们</a>
        </div>

        <div ng-view="">
        </div>
    </div>
</body>

</html>

自定义指令eg.

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<script>
    var app = angular.module("myApp", []);
    app.directive("iflyDirective", function () {
        return {
            template: "<h1>我的指令!</h1>"
        };
    });
</script>

<body ng-app="myApp">  
    <ifly-directive></ifly-directive>
</body>

</html>

AngularJS 基础

AngularJS 基础-指令

ng-app、ng-init、ng-model指令

AngularJS指令带有前缀 ng-,通过指令的新属性来扩展 HTML, 通过内置的指令来为应用添加功能,允许你自定义指令。

常用的ng-app 指令是初始化一个 AngularJS 应用程序,ng-app 指令定义了 AngularJS 应用程序的 根元素,在网页加载完毕时会自动引导(自动初始化)应用程序。

ng-init 指令初始化应用程序数据;

ng-app 指令定义一个 AngularJS 应用程序;

ng-model 指令把元素值(比如输入域的值)绑定到应用程序;

ng-bind 指令把应用程序数据绑定到 HTML 视图。也可以使用{{}}来简写。

代码示例:

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

当网页加载完毕,AngularJS 自动开启:

ng-app 指令告诉 AngularJS,

元素是 AngularJS 应用程序 的"所有者"。

ng-model 指令把输入域的值绑定到应用程序变量 name。

ng-bind 指令把应用程序变量 name 绑定到某个段落的 innerHTML。

双向绑定,在修改输入域的值时, AngularJS 属性的值也将修改。

ng-repeat指令

ng-repeat 指令对于集合(数组)中的每一个项目会 复制一次 HTML 元素。

例如:

<div ng-app="" ng-init="names=[{name:'王',country:'一'},{name:'李',country:'二'},{name:'钱',country:'三'}]">
    <p>循环对象:</p>
    <ul>
        <li ng-repeat="x in names">
        {{ x.name + ', ' + x.country }}</li>
    </ul>
</div>

网页显示结果为: blob.png

这里的ng-init是数据的初始化,通过ng-repeat依次将names数组的值赋值给x(跟C语言里面的for循环有些类似),首先是{name:‘王’,country:‘一’}赋给x,通过x.name和x.country打印出值来,以此类推。需要注意的是,ng-repeat="x in names"这里面的x和names都是自定义的,{{}}里面如果是字符串的话 需要用引号引起来。

ng-if指令

定义和用法:

ng-if 指令用于在表达式为 false 时移除 HTML 元素。

如果 if 语句执行的结果为 true,会添加移除元素,并显示。

ng-if 指令不同于 ng-hide, ng-hide 隐藏元素,而 ng-if 是从 DOM 中移除元素。

语法:

image.png

这里的element是指div,p,span等这些标签。

参数值:

image.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body ng-app="">
<!--在此编写代码-->

<p>当复选框取消选中时 DIV 元素将移除。</p>
<p>当重新选中复选框,DIV 元素会重新显示。</p>
<input type="checkbox" ng-model="myVar" ng-init="myVar = true">
<div ng-if="myVar">
    <h1>Welcome</h1>
    <p>Welcome to my home.</p>
    <hr>
</div>
</body>
</html>

ng-value指令

定义和用法:

ng-value 指令用于设置 input 或 select 元素的 value 属性。

语法:

image.png

参数值:

image.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="myCtrl">
<input ng-value="myVar">
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.myVar = "Hello World!";

});
</script>

<p>该实例演示了如何使用 AngularJS 表达式来设置输入框的值。</p>
</body>
</html>

ng-src指令

定义和用法:

ng-src 指令覆盖了 元素的 src 属性。

如果你使用了 AngularJS 代码设置图片地址,请使用 ng-src 指令替代 src 属性。

ng-src 指令确保的 AngularJS 代码执行前不显示图片。

语法:

image.png

参数值:

image.png

自定义指令

AngularJS 除内置的指令外,还可以创建自定义指令。你可以使用 .directive 函数来添加自定义指令。

当调用自定义指令时,HTML 元素需要添加自定义指令名。使用驼峰法来命名一个指令, 比如iflyDirective。 但在使用它时需要以 符号“-” 分割, 正确的格式为ifly-directive。

限制使用:

你可以限制你的指令只能通过特定的方式来调用,通过添加 restrict 属性并设置值, 来设置指令只能通过属性的方式来调用。

restrict值可以是以下几种:

E 作为元素名使用

A 作为属性使用

C 作为类名使用

M 作为注释使用

restrict默认值为 EA, 即可以通过元素名和属性名来调用指令。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> 
</head>
<body ng-app="myApp">
<ifly-directive></ifly-directive>
<script>
var app = angular.module("myApp", []);
app.directive("iflyDirective", function() {
    return {
        template : "<h1>我的指令!</h1>"
    };
});
</script>
</body>
</html>

AngularJS 基础-表达式

数字运算

AngularJS 表达式写在双大括号内:{{ expression }},AngularJS 表达式把数据绑定到 HTML,这与 ng-bind 指令一样。AngularJS 将在表达式书写

的位置"输出"数据。AngularJS表达式很像 JavaScript 的表达式:它们可以包含文字、运算符和变量。

AngularJS 数字就像 JavaScript 数字,例如:

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

网页显示结果为:总价50。

使用 ng-bind 的方式:

<div ng-app="" ng-init="quantity=10;cost=5">
<p>总价: <span ng-bind="quantity * cost"></span></p>
</div>

AngularJS 基础-输入验证

1.必填验证

某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可:

<input type="text" required />

2.最小长度

验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= “{number}”

<input type="text" ng-minlength="5" />

3.最大长度

验证表单输入的文本长度是否小于或等于某个最大值,在输入字段上使用指令ng-maxlength=“{number}”

<input type="text" ng-maxlength="20" />

4.模式匹配

使用**ng-pattern=“/PATTERN/”**来确保输入能够匹配指定的正则表达式:

<input type="text" ng-pattern="/[a-zA-Z]/" />

5.邮箱验证

验证输入内容是否是邮箱地址,只要像下面这样将input的类型设置为email即可:

<input type="email" name="email" ng-model="user.email" />

6.数字验证

验证输入内容是否是数字,将input的类型设置为number:

<input type="number" name="age" ng-model="user.age" />

7.URL验证

验证输入内容是否是URL,将input的类型设置为 url:

<input type="url" name="homepage" ng-model="user.facebook_url" />

另外AngularJS还提供了表单验证属性

image.png

AngularJS 基础-事件

什么是事件:

如同浏览器响应浏览器层的事件,比如鼠标点击、获得焦点,angular应用也可以响应angular事件,angular事件系统并不与浏览器的事件系统相通,我们只能在作用域上监听angular事件而不是DOM事件。

事件传播:

因为作用域是有层次的,所以我们可以在作用域链上传递事件:

使用$emit冒泡事件,事件从当前子作用域冒泡到父作用域,在产生事件的作用域之上的所有作用域都会收到这个事件的通知。

$emit()方法带有两个参数:

name 是要发出的事件的名称

args 是一个参数集合,作为对象传递到事件监听器上。

使用$broadcast向下传递事件,每个注册了监听器的子作用域都会收到这个信息。

$broadcast()方法带有两个参数:

name 是要广播的事件的名称

args 是一个参数集合,作为对象传递到事件监听器上。

使用$on监听事件

$on()方法带有两个参数:

event 是事件对象,param 是参数集合,是 b r o a d c a s t ( ) 、 broadcast()、 broadcast()emit()传递过来的参数 集合。

事件对象属性

$on中的event事件对象属性如下:

targetScope(作用域对象)

发送或者广播事件的作用域;

currentScope(作用域对象)

当前处理事件的作用域;

name(字符串)

正在处理事件的名称;

stopPropagation(函数)

取消通过$emit触发事件的进一步传播;

preventDefault(函数)

preventDefault()把defaultprevented标志设置为true,尽管不能停止事件传播,但 是子作用域可以通过defaultprevented标志知道无需处理这个事件;

defaultPrevented(布尔值)

可以通过判断defaultPrevented属性来判断父级传播的事件是否可以去忽略。

常用事件

ng-click鼠标单击触发某事件
ng-dblclick鼠标双击触发某事件
ng-blur失去焦点触发某事件,适用标签:a、input、select、textarea
ng-focus获取焦点触发某事件,与ng-blur相反,适用标签:a、input、select、textarea
ng-changemodel更新触发某事件,适用标签:input
ng-copy鼠标右键复制和快捷键Ctrl+C都会触发,适用标签:input、textarea
ng-cut鼠标右键剪切和快捷键Ctrl+X都会触发,适用标签:a、input、select、textarea
ng-paste鼠标右键粘贴和快捷键Ctrl+V都会触发,适用标签:a、input、select、textarea
ng-keydown键盘按键按下触发某事件,要把$event传过去,一般都是要判断按了哪个按键的,适用所有标签
ng-keyup键盘按键按下并松开触发某事件,要把$event传过去,一般都是要判断按了哪个按键的,适用所有标签
ng-keypress键盘按键保持按下触发某事件,要把$event传过去,一般都是要判断按了哪个按键的,适用所有标签
ng-mousedown鼠标按下触发某事件,适用所有标签
ng-mouseup鼠标按下弹起触发某事件,适用所有标签
ng-mouseenter鼠标进入触发某事件,适用所有标签
ng-mouseleave鼠标离开触发某事件,适用所有标签
ng-mousemove鼠标移动触发某事件,适用所有标签

**

**

AngularJS中ngAnimate模块支持动画效果,但是ngAnimate模块并未包含在AngularJS核心库中,因此需要使用ngAnimate需要在定义Module时声明对其的引用。

基于CSS的动画效果

动画是通过改变 HTML 元素产生的动态变化效果。

ngAnimate 可以做什么?

ngAnimate 模型可以添加或移除 class 。

ngAnimate 模型并不能使 HTML 元素产生动画,但是 ngAnimate 会监测事件,类似隐藏显示 HTML 元素 ,如果事件发生 ngAnimate 就会使用预定义的 class 来设置 HTML 元素的动画。

AngularJS 添加/移除 class 的指令:

ng-show

ng-hide

ng-class

ng-view

ng-include

ng-repeat

ng-if

ng-switch

ng-show 和 ng-hide 指令用于添加或移除 ng-hide class 的值。

其他指令会在进入 DOM 会添加 ng-enter 类,移除 DOM 会添加 ng-leave 属性。

当 HTML 元素位置改变时,ng-repeat 指令同样可以添加 ng-move 类 。

此外, 在动画完成后,HTML 元素的类集合将被移除。例如: ng-hide 指令会添加一下类:

ng-animate

ng-hide-animate

ng-hide-add (如果元素将被隐藏)

ng-hide-remove (如果元素将显示)

ng-hide-add-active (如果元素将隐藏)

ng-hide-remove-active (如果元素将显示)

引入 angular-animate.min.js 库:

<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular-animate.min.js"></script>

在应用中使用模型 ngAnimate:

<div ng-app="ngAnimate"></div>

AngularJS中实现动画效果有两大种方式:

1)基于CSS的动画效果

CSS Transition Animation

CSS Class-based Animation

2)基于Javascript的动画效果

示例:

3.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
div {
  transition: all linear 0.5s;
  background-color: lightgreen;
  height: 200px;
  width: 100%;
  position: relative;
  top: 0;
  left: 0;
  color:red;
  font-size:40px;
}
.ng-hide {
  height: 0;
  width: 0;
  background-color: transparent;
  top:-200px;
  left: 200px;
}
</style>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular-animate.min.js"></script>
</head>
<body ng-app="ngAnimate">
<div ng-hide="myCheck">动画</div>
<h1>控制绿色方框显示: <input type="checkbox" ng-model="myCheck"></h1>
</body>
</html>

基于Javascript的动画效果

<!DOCTYPE html>
<html>
<head>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular-animate.min.js"></script>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
     <script type="text/javascript">
         (function () {
            var app = angular.module('javascriptBasedAnimationTest', ['ngAnimate']);
             app.animation('.slide', [function () {
                 return {
                    enter: function (element, doneFn) {
                       jQuery(element).fadeIn(1000, doneFn);
                    },
                     move: function (element, doneFn) {
                         jQuery(element).fadeIn(1000, doneFn);
                     },
  
                     leave: function (element, doneFn) {
                        jQuery(element).fadeOut(1000, doneFn);
                    }
                 }
             }]);
            app.controller('myController', ['$scope', function ($scope) {
                 $scope.students = ["WEB前端开发",".NET开发","软件测试","JAVA开发","Android开发"];
             }]);
        })();
    </script>
</head>
 <body ng-app="javascriptBasedAnimationTest" ng-controller="myController">
     <div ng-if="isshow" ng-repeat="stu in students" class="slide">
        {{ stu }}
     </div>
     <input type="button" value="Toggle" ng-click="isshow=!isshow" />
 </body>
</html>

AngularJS 基础-过滤器

AngularJS的内置过滤器,过滤器可以使用一个管道字符(|)添加到表达式和指令中。

内置过滤器的使用方法:

1)一个过滤器,不带参数的情况

 {{expression | filter}}

2)一个过滤器,带参数的情况

{{expression | filter:arguments}}

3)一个过滤器,带多个参数的情况

{{expression | filter: arg1: arg2: ...}}

4)多个过滤器,不带参数的情况

{{expression | filter1 | filter2 | ...}}

下面分别使用以下AngularJS的内置过滤器:

currency

currency允许我们设置自己的货币符号,默认情况下会采用客户端所处区域的货币符号。

可以这样使用:

<div ng-app>
    <div> {{ 123 | currency: "$¥" }} </div>
</div>

返回结果为:

$¥123.00

number

number过滤器将数字格式化成文本,它的参数是可选的,用来控制小数点后的截取位数。

如果传入的是一个非数字字符,会返回空字符串。

可以这样使用:

<div ng-app>
    <div>{{ 3600 | number:2}}</div>
    <div>{{ 3600 | number}}</div>
    <div>{{3600 | number:"a"}}</div>
    <div>{{3600 | number:a}}</div>
</div>

返回结果为:

3,600.00

3,600

NaN.

3,600

lowercase

lowercase将字符串转换为小写。

可以这样使用:

<div ng-app>
    <div>{{ "HEllo" | lowercase}}</div>
</div>

返回结果为:hello

uppercase

uppercase将字符串转换为大写。

可以这样使用:

<div ng-app>
    <div>{{ "HEllo" | uppercase}}</div>
</div>

返回结果为:HELLO

json

json过滤器可以将一个JSON或者JavaScript对象转换成字符串。

这个过滤器对调试相当有用。

可以这样使用:

<div ng-app>
    <div>{{ {"name":"dreamapple","language":"AngularJS"} | json}}</div>
</div>

返回结果为:{ “name”: “dreamapple”, “language”: “AngularJS” }

date

date过滤器将日期过滤成你想要的格式。

{{ today | date: "yyyy - mm - dd"}}

结果为:2016- 08 – 10

{{ today | date: "yyyy - mm - dd HH:mm::ss"}}

结果为:2016 - 08 - 10 20:18::38

eg.利用过滤器格式化数字为货币格式,并且格式化大写字母为小写字母。效果如下:

123.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="personCtrl">

<p>商品为 {{ lastName | lowercase }},价格为{{ number | currency }}</p>
</div>

<script>
var app = angular.module('myApp', []);
app.controller('personCtrl', function($scope) {
    $scope.lastName = "MP4";
	$scope.number=500;
});
</script>

</body>
</html>

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

实现效果:

1.png

<!DOCTYPE html>
<html ng-app>
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>
        <div ng-controller="ctl">
            搜索:<input ng-model="query">
            排序:<select ng-model="order">
                <option value="name">姓名</option>
                <option value="age">年龄</option>
            </select>
            <ul class="persons">
                <li ng-repeat="person in persons | filter:query | orderBy:order">
                    {{person.name}}
                     
                    {{person.age}}
                </li>
            </ul>
        </div>
        <script type="text/javascript">
            function ctl($scope){
                $scope.persons = [
                    {"name":"张梦雪","age":25},
                    {"name":"吴敏霞","age":18},
                    {"name":"施廷懋","age":20},
                    {"name":"龙清泉","age":30}
                ];
                $scope.order = "age";
            }
        </script>
    </body>
</html>

AngularJS 基础-Scope

图片 1.png

通过ng-app指令来自动引导AngularJS应用是一种简洁的方式,适合大多数情况。

一旦AngularJS应用引导完毕,它将继续侦听浏览器的HTML触发事件,如鼠标点击事件、按键事件、HTTP传入响应等改变DOM模型的事件。这类事件一旦发生,AngularJS将会自动检测变化,并作出相应的处理及更新。

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

AngularJS 应用组成如下:

1)View(视图), 即 HTML;

2)Model(模型), 当前视图中可用的数据;

3)Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。

MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开,应用程序被分成三个核心部件:模型、视图、控制器,它们各自处理自己的任务。

图片 2.png

AngularJS中MVC的基本步骤:

①声明一个模块

var app = angular.module(‘模块名字’,[依赖列表])

②注册模块

ng-app=‘模块名字’

③声明控制器

app.controller(“控制器的名字”,func)

④使用控制器

    <div ng-controller='控制器的名字'></ div >

⑤操作模型数据

$scope对象去定义模型数据: $scope.name=‘mini_fan’

​ $scope是建立模型数据和视图的桥梁

$scope 的作用:

$scope 对象在 Angular 中充当数据模型的作用,也就是一般 MVC 框架中 Model 得角色。但又不完全与通常意义上的数据模型一样,因为 $scope 并不处理和操作数据,它只是建立了视图和 HTML 之间的桥梁,让视图和 Controller 之间可以友好的通讯。

再进一步系统的划分它的作用和功能:

①提供了观察者可以监听数据模型的变化

②可以将数据模型的变化通知给整个 App

③可以进行嵌套,隔离业务功能和数据

④给表达式提供上下文执行环境

$scope 生命周期:

Angular 中也有一个’事件’的概念,比如当一个绑定了 ng-model 的 input 值发生变化时,或者一个 ng-click 的 button 被点击时,Angular 的事件循环就会启动。这里事件就在 Angular 执行上下文中处理,$scope 就会对定义的表达式求值。此时事件循环被启动, Angular 会监控应用程序内所有对象,脏值检查循环也会启动。

$scope 的生命周期有4个阶段:

1)创建:控制器或者指令创建时, Angular 会使用 $injector 创建一个新的作用域,然后在控制器或指令运行时,将作用域传递进去。

2)链接:Angular 启动后会将所有 $scope 对象附加或者说链接到视图上,所有创建 $scope 对象的函数也会被附加到视图上。这些作用域将会注册当 Angular 上下文发生变化时需要运行的函数。也就是 $watch 函数, Angular 通过这些函数或者何时开始事件循环。

3)更新:一旦事件循环开始运行,就会开始执行自己的脏值检测。一旦检测到变化,就会触发 $scope 上指定的回调函数。

4)销毁:通常一个 $scope 在视图中不再需要, Angular 会自己清理它。当然也可以通过 $destroy() 函数手动清理。

eg

<!DOCTYPE html>
<!--2.通过ngApp指令 完成模块的注册-->
<html ng-app="myModule">

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body ng-controller="myCtrl">
<!--4.在body被加载的时候,会去执行myCtrl控制器-->
    <table>
        <thead>
            <tr>
                <th>序号</th>
                <th>商品</th>
                <th>单价</th>
                <th>数量</th>
                <th>小计</th>
                <th>删除</th>
            </tr>
        </thead>

        <tbody>
            <tr ng-repeat="tmp in cart track by $index">
                <td>{{$index}}</td>
                <td>{{tmp.name}}</td>
                <td>{{tmp.price}}</td>
                <td>{{tmp.num}}</td>
                <td>{{tmp.price*tmp.num}}</td>
                <td><button ng-click="deleteCart($index)">删除</button></td>
            </tr>
        </tbody>
    </table>
    <button ng-click="addCart()">添加</button>
    <script>
        //    1.声明一个模块
        var app = angular.module('myModule', ['ng']);
        //    3.控制器的声明
        app.controller('myCtrl', function ($scope) {
            //    5.操作模型数据
            $scope.cart = [{
                    name: "苹果",
                    price: 4,
                    num: 2
                },
                {
                    name: "香蕉",
                    price: 6,
                    num: 1
                },
                {
                    name: "桃",
                    price: 5,
                    num: 3
                }
            ];
            $scope.deleteCart = function ($index) {
                $scope.cart.splice($index, 1);
            }
            $scope.addCart = function () {
                $scope.cart.push({
                    name: "葡萄",
                    price: 3,
                    num: 4
                });
            }
        });
    </script>
</body>
</html>

Scope使用

Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。Scope 是一个对象,有可用的方法和属性。当我们在 AngularJS 创建控制器时,可以将 $scope 对象当作一个参数传递。

例如:

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

当在控制器中添加 $scope 对象时,视图 (HTML) 可以获取这些属性。视图中,你不需要添加 $scope 前缀, 只需要添加属性名即可,如: {{carname}}。

Scope作用范围

$scope 的使用贯穿整个 Angular App 应用,它与数据模型相关联,同时也是表达式执行的上下文。有了 s c o p e 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 scope 就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新 scope就在视图和控制器之间建立了一个通道,基于作用域视图在修改数据时会立刻更新scope,同样的 $scope 发生改变时也会立刻重新渲染视图。

13.jpg

有了 $scope 这样一个桥梁,应用的业务代码可以都在 controller 中,而数据都存放在controller 的 $scope 中。了解当前使用的 scope对应的作用域是非常重要的。

示例:当使用 ng-repeat 指令时,每个重复项都访问了当前的重复对象:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<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 = ["合肥", "芜湖", "安庆"];
});
</script>
</body>
</html>

AngularJS 基础-根作用域

​ 所有的应用都有一个 $rootScope,它可以作用在ng-app 指令包含的所有 HTML 元素中。Angular 应用启动并生成视图时,会将根 ng-app 元素与 r o o t S c o p e 进行绑定, rootScope 进行绑定, rootScope进行绑定,rootScope 是所有 $scope 的最上层对象,可以理解为一个 Angular 应用中得全局作用域对象,所以为它附加太多逻辑或者变量并不是一个好主意,和污染 Javascript 全局作用域是一样的。

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

创建控制器时,将 $rootScope 作为参数传递,可在应用中使用,

例如:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> $rootScope 在循环对象内外都可以访问</title>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<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 = ["一", "二", "三"];
    $rootScope.lastname = "王";
});
</script>
</body>
</html>

AngularJS 基础-控制器方法

AngularJS 控制器控制 AngularJS 应用程序的数据,ng-controller 指令定义了应用程序控制器。控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数创建。

eg. ng-controller=“personCtrl” 属性是一个 AngularJS 指令,用于定义一个控制器。personCtrl 函数是一个 JavaScript 函数。AngularJS 使用$scope 对象来调用控制器。

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="personCtrl">
姓名: <input type="text" ng-model="Name"><br>
编号: <input type="text" ng-model="Code"><br>
<br>
奥运选手: {{fullName()}}
</div>
<script>
var app = angular.module('myApp', []);
app.controller('personCtrl', function($scope) {
    $scope.Name = "杜丽";
    $scope.Code = "cn001";
    $scope.fullName = function() {
        return $scope.Name + " " + $scope.Code;
    }
});
</script>
</body>
</html>

外部文件中的控制器

在项目较为复杂的应用程序中,通常是把控制器存储在外部文件中,为了方便管理。使用外部或者远程控制器personController.js 时,只需要通过

AngularJS 基础-添加控制器、指令

自定义指令;

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> 
</head>
<body>
<div ng-app="myApp" xuexuexi-directive></div>
<script>
var app = angular.module("myApp", []);
app.directive("xuexuexiDirective", function() {
    return {
        template : "自定义指令:xuexuexiDirective!"
    };
});
</script>
</body>
</html>

AngularJS 控件

ng-options指令与ng-repeat指令

在 AngularJS 中我们可以使用 ng-options 指令来创建一个下拉列表,列表项通过对象和数组循环输出。

示例:

blob.png

<div ng-app="myApp" ng-controller="myCtrl">
<select ng-model="selectedName" ng-options="x for x in names">
</select>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.names = ["中国", "俄罗斯", "美国", "法国", "英国"];
});
</script>

AngularJS 控件-数据源为对象

数据对象

AngularJS可以使用数组作为数据源,也可以把数据对象作为数据源。

示例:使用对象作为数据源, x 为键(key), y 为值(value)

blob.png

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    <link rel="stylesheet" href="http://apps.bdimg.com/libs/bootstrap/3.3.0/css/bootstrap.min.css">  
    <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://apps.bdimg.com/libs/bootstrap/3.3.0/js/bootstrap.min.js"></script>
</head>
<body>
    <div ng-controller="EngineeringController" class="row">
        <div class="col-md-8">

             <label class="col-md-4">您的选择是: {{ engineer.currentActivityId}}</label>
        </div>
        <div class="col-md-8">
             <label class="col-md-1">选择:</label>
             <!--在此编写代码-->
             <select class="col-md-4" ng-model = "engineer.currentActivityId" ng-options = "a.id as a.name group by a.type for a in activities" >               
            </select >


        </div>
    </div>
    <script type="text/javascript">
         var myAppModule = angular.module("myApp",[]);
         myAppModule.controller("EngineeringController",["$scope",function($scope){
            $scope.engineer = {
                 currentActivityId: 2
             };
         
             $scope.activities =
             [   
				{ id: 1, type: "WEB前端开发" , name: "PHP" },
                 { id: 2, type: "WEB前端开发" , name: "HTML5" },
                 { id: 3, type: "企业软件开发" , name: "JAVA" },
                 { id: 4, type: "企业软件开发" , name: ".NET" }

             ];
         }]);
    </script>
</body>
</html>

blob.png

在表格中显示数据

使用ng-repeat 指令可以显示表格。

实例:

blob.png

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <style>
        table,
        th,
        td {
            border: 1px solid grey;
            border-collapse: collapse;
            padding: 5px;
        }

        table tr:nth-child(odd) {
            background-color: #f1f1f1;
        }

        table tr:nth-child(even) {
            background-color: #ffffff;
        }
    </style>
</head>

<body>
    <div ng-app="myApp" ng-controller="customersCtrl">
        <table>
            <tr ng-repeat="x in names">
                <td>{{ x.Name }}</td>
                <td>{{ x.Country }}</td>
            </tr>
        </table>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('customersCtrl', function ($scope, $http) {
            $scope.names = [{
                    "Name": "MengxueZhang",
                    "City": "Jinan",
                    "Country": "China"
                },
                {
                    "Name": "Yangsun",
                    "City": "Hangzhou",
                    "Country": "China"
                },
                {
                    "Name": "YanmeiXiang",
                    "City": "Baojing",
                    "Country": "China"
                }
            ];
        });
    </script>
</body>

AngularJS 控件- orderBy 过滤器

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<style>
table, th , td  {
  border: 1px solid grey;
  border-collapse: collapse;
  padding: 5px;
}
table tr:nth-child(odd)	{
  background-color: #f1f1f1;
}
table tr:nth-child(even) {
  background-color: #ffffff;
}
</style>
</head>
<body>

<div ng-app="myApp" ng-controller="namesCtrl"> 

<table>
	 <tr>
    <td>姓名</td>
    <td>身高</td>
  	</tr>
 <!--在此编写代码-->
</table>

</div>

<script>
angular.module('myApp', []).controller('namesCtrl', function($scope) {
    $scope.names = [
        {name:'老胡', height:'190'},
        {name:'老张',height:'174'},
        {name:'老韩',height:'175'},
		{name:'老马',height:'176'},
        {name:'老丁',height:'171'},
        {name:'老姜',height:'185'}
    ];
})
</script>


</body>
</html>


显示序号

表格显示序号可以在 中添加 $index

使用 $index可以显示序号。

示例:

blob.png

e v e n 和 even和 evenodd

even表示奇数,odd表示偶数,使用 e v e n 和 even和 evenodd控制表格奇偶项:

示例:

blob.png

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <style>
        table,
        td {
            border: 1px solid grey;
            border-collapse: collapse;
            padding: 5px;
        }
    </style>
</head>

<body>
    <div ng-app="myApp" ng-controller="customersCtrl">
        <table>
            <tr ng-repeat="x in names">
                <td ng-if="$odd" style="background-color:#f1f1f1">
                    {{ x.Name }}</td>
                <td ng-if="$even">
                    {{ x.Name }}</td>
                <td ng-if="$odd" style="background-color:#f1f1f1">
                    {{ x.Country }}</td>
                <td ng-if="$even">
                    {{ x.Country }}</td>
            </tr>
        </table>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('customersCtrl', function ($scope, $http) {

            $scope.names = [{
                    "Name": "MengxueZhang",
                    "City": "Jinan",
                    "Country": "China"
                },
                {
                    "Name": "Yangsun",
                    "City": "Hangzhou",
                    "Country": "China"
                },
                {
                    "Name": "YanmeiXiang",
                    "City": "Baojing",
                    "Country": "China"
                }
            ];

        });
    </script>
</body>

</html>

使用 e v e n 和 even和 evenodd控制表格的背景颜色并且输出序号。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
<style>
table, td  {
  border: 1px solid grey;
  border-collapse: collapse;
  padding: 5px;
}
</style>
</head>
<body>

<div ng-app="myApp" ng-controller="namesCtrl"> 

<table>

 <tr ng-repeat="x in names">

                <td ng-if="$odd" style="background-color:lightblue">
                    {{ $index + 1}}</td>
                <td ng-if="$even" >
                    {{ $index + 1}}</td>
                <td ng-if="$odd" style="background-color:lightgreen">
                    {{ x.name }}</td>
                <td ng-if="$even">
                    {{ x.name }}</td>
                <td ng-if="$odd"style="background-color:lightyellow" >
                    {{ x.height }}</td>
                <td ng-if="$even">
                    {{ x.height }}</td>
            </tr>
</table>

</div>

<script>
angular.module('myApp', []).controller('namesCtrl', function($scope) {
    $scope.names = [
        {name:'老胡', height:'190'},
        {name:'老张',height:'174'},
        {name:'老韩',height:'175'},
		    {name:'老马',height:'176'},
        {name:'老丁',height:'171'},
        {name:'老姜',height:'185'}
    ];
})
</script>

</body>
</html>

blob.png

AngularJS 服务

AngularJS 服务-$http 服务

服务这个概念其实并不陌生,在其它语言中便有这样的概念(如java),其作用就是对外提供某个特定的功能,如消息服务,文件压缩服务等,是一个独立的模块。它是一个单例对象或函数,对外提供特定的功能。

在AngularJS中有很多的服务,常用的比如http,location等等。

$http的使用:

$http用于发送http请求,动态的请求数据。这样就需要使用web容器来运行代码了,先看看程序源码,视图方面还是跟普通的代码相同:

1)创建一个无序列表,循环输出请求到的数据。

<div ng-controller="myAppCtrl">
            <ul>
                <li ng-repeat="user in users">
                    {{user.name}}
                </li>
            </ul>
        </div>

2)在js中,创建一个模板,在模板上创建控制器。

<script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);
            myAppModule.controller('myAppCtrl',['$scope','$http',function($scope,$http){
                $http({
                    method:'GET',
                    url:'data.json'
                }).success(function(data,status,headers,config){
                    console.log("success!...");
                    console.log(data);
                    $scope.users = data;
                }).error(function(data,status,headers,config){
                    console.log("error!...");
                });
            }]);
        </script>

该控制器比前面提到的控制器多了一个注入的参数$http,添加了这个参数,就可以在方法内部直接调用。

采用如下的格式:

$http({
  method:'GET',//http请求的类型
  url:'data.json'//请求的地址
}).success(function(data,status,headers,config){
  //成功了,怎么做
}).error(function(data,status,headers,config){
  //失败了,怎么做
});

3)接下来需要在代码相同的路径下,创建data.json文件

[{
    "name":"test1"
},{
    "name":"test2"
},{
    "name":"test3"
}]

利用web容器,访问结果如下:blob.png

$location 服务

$location 服务,它可以返回当前页面的 URL 地址。

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<p> 获取当前url地址:</p>
<h3>{{myUrl}}</h3>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $location) {
    $scope.myUrl = $location.absUrl();
});
</script>
</body>
</html>

$location 服务是作为一个参数传递到 controller 中。

$timeout服务

AngularJS中的 t i m e o u t 服务和 j a v a s c r i p t 中原生的 s e t T i m e o u t ( ) 以及 s e t I n t e r v a l ( ) 函数类似,但 A n g u l a r J S 中的 timeout 服务和javascript中原生的setTimeout()以及setInterval()函数类似,但AngularJS中的 timeout服务和javascript中原生的setTimeout()以及setInterval()函数类似,但AngularJS中的timeout()函数会返回一个promise。

例如:实现如图效果

blob.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myCtrl"> 
<p>10秒后将变化:</p>
<h1>{{myHeader}}</h1>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $timeout) {
  $scope.myHeader = "巴西世界杯!";
  $timeout(function () {
      $scope.myHeader = "里约奥运会!";
  }, 10000);
});
</script>
</body>
</html>

$interval

AngularJS 中的$interval 服务和JavaScript中的 window.setInterval 函数类似,实现周期性调用。

示例:

blob.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myCtrl"> 
<p>时钟:</p>
<h2>{{theTime}}</h2>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $interval) {
  $scope.theTime = new Date().toLocaleTimeString();
  $interval(function () {
      $scope.theTime = new Date().toLocaleTimeString();
  }, 1000);
});
</script>
</body>
</html>

自定义服务

AngularJS除了使用内置服务之外,你可以创建自己的Service服务。创建服务可以通过三种方式:factory、provider和service,但是它们的本质都是Provider,只是封装了不同的写法而已。

下面采用factory的形式:

blob.png

1)先创建一个模块,在模块的基础上创建一个Service:

 var myAppModule = angular.module("myApp",[]);
            myAppModule.factory('myService',['$http',function($http){
                var doRequest = function(username){
                    return $http({
                        method:'GET',
                        url:'data.json'
                    });
                }
                return {
                    userList:function(username){
                        return doRequest(username);
                    }
                }
            }]);

代码分析:

这个Service需要注入一个属性 $http ,在方法内部,返回的值是一个对外提供的方法,userList。外部可以通过 userList(username) 的方式,进行调用。

真正的实现部分放在 doRequest 中,内部就是典型的一个AngularJS的$http请求了,请求会返回url相应的数据。

2)然后看一下外部如何使用,先看看视图部分:

<div ng-controller="myAppCtrl">
            <label>username</label>
            <input type="text" ng-model="username" placeholder="输入"/>
            <pre ng-show="username">
                {{users}}
            </pre>
        </div>

该部分是一个输入框input和一个代码框pre,它们共同使用了一个变量username。当username有值时,会在下面展示users对应的内容。

myAppModule.controller('myAppCtrl',['$scope','$timeout','myService',
                function($scope,$timeout,myService){
                    var timeout;
                    $scope.$watch('username',function(newUserName){
                        console.log("您输入了:"+newUserName);
                        if(newUserName){
                            if(timeout){
                                $timeout.cancel(timeout);
                            }
                            timeout = $timeout(function(){
                                myService.userList(newUserName).success(function(data){
                                    console.log(data);
                                    $scope.users = data;
                                });
                            },350);
                        }
                    });
                }
            ]);

在对应的控制器中,采用了$watch这种监控方法,监控username属性的变化。当username属性变化时,会触发请求方法。

控制器多注入了一个 t i m e o u t 变量,该变量用于控制输入的时间。代码观察 timeout变量,该变量用于控制输入的时间。代码观察 timeout变量,该变量用于控制输入的时间。代码观察timeout(function(…),350);当输入的间隔超过350ms时,就会触发相应函数function(…)。这样可以有效的防止,不停的刷新请求,造成网页的刷新抖动。

在函数内部,调用了我们自己的服务提供的userList方法。当请求成功时,绑定返回值到users中。users会动态的刷新内容。

3)data.json数据:

[{
    "name":"test1"
},{
    "name":"test2"
},{
    "name":"test3"
}]

4)完整代码:

<!doctype html>
<html ng-app="myApp">
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
    </head>
    <body>
        
        <div ng-controller="myAppCtrl">
            <label>username</label>
            <input type="text" ng-model="username" placeholder="输入"/>
            <pre ng-show="username">
                {{users}}
            </pre>
        </div>
        <script type="text/javascript">
            var myAppModule = angular.module("myApp",[]);
            myAppModule.factory('myService',['$http',function($http){
                var doRequest = function(){
                    return $http({
                        method:'GET',
                        url:'data.json'
                    });
                }
                return {
                    userList:function(){
                        return doRequest();
                    }
                }
            }]);
            myAppModule.controller('myAppCtrl',['$scope','$timeout','myService',
                function($scope,$timeout,myService){
                    var timeout;
                    $scope.$watch('username',function(newUserName){
                        console.log("您输入了:"+newUserName);
                        if(newUserName){
                            if(timeout){
                                $timeout.cancel(timeout);
                            }
                            timeout = $timeout(function(){
                                myService.userList().success(function(data){
                                    console.log(data);
                                    $scope.users = data;
                                });
                            },350);
                        }
                    });
                }
            ]);
        </script>
    </body>
</html>

全局API

angular.lowercase()转换字符串为小写

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body>
    <div ng-app="myApp" ng-controller="myCtrl">
        <p>{{ one }}</p>
        <p>{{ two }}</p>
    </div>
    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            $scope.one = "IFLYSSE";
            $scope.two = angular.lowercase($scope.one);
        });
    </script>
</body>

</html>

angular.uppercase()实现转换字符串为大写

全局API函数angular.isNumber()判断给定的对象是否为数字,如果是返回 true。

全局API函数angular.isString()判断给定的对象是否为字符串,如果是返回 true。

AngularJS 依赖注入

依赖注入介绍

依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。

AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在。

AngularJS 提供很好的依赖注入机制,以下5个核心组件用来作为依赖注入:value、factory、service、provider、constant。

要实现注入,基本有三步:

①得到模块的依赖项

②查找依赖项所对应的对象

③执行时注入

创建value 对象

Value值是简单的JavaScript对象,使用一个值定义服务,这个值就是服务实例。

定义一个模块

var mainApp = angular.module("mainApp", []);

创建 value 对象 “defaultInput” 并传递数据

mainApp.value("defaultInput", 5);

将 “defaultInput” 注入到控制器

mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
   $scope.number = defaultInput;
   $scope.result = CalcService.square($scope.number);
   
   $scope.square = function() {
      $scope.result = CalcService.square($scope.number);
   }
});

eg

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body>
    <div ng-app="myApp" ng-controller="myCtrl">
        <p>{{ result }}</p>
    </div>
    <script>
        var mainApp = angular.module('myApp', []);
        
        mainApp.value("defaultInput", 5);

        mainApp.controller('myCtrl', function ($scope, defaultInput) {
            $scope.number = defaultInput;

            $scope.result = $scope.number;

        });
    </script>
</body>

</html>

factory工厂

工厂是用于返回函数的值。每当一个服务或控制器需要它会根据需求创造值。它通常使用一个工厂函数来计算并返回对应值。

定义一个模块

var mainApp = angular.module("mainApp", []);

创建 factory “MathService” 用于两数的乘积

mainApp.factory('MathService', function() {
   var factory = {};
   
   factory.multiply = function(a, b) {
      return a * b
   }
   return factory;
});

在 service 中注入 factory “MathService”

mainApp.service('CalcService', function(MathService){
   this.square = function(a) {
      return MathService.multiply(a,a);
   }
});
...

eg

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body>
    <div ng-app="mainApp" ng-controller="myCtrl">
        <p>{{ result }}</p>
    </div>
    <script>
        var mainApp = angular.module('mainApp', []);

        mainApp.factory('MathService', function () {
            var factory = {};

            factory.multiply = function (a, b) {
                return a * b
            }
            return factory;
        });

        mainApp.controller('myCtrl', function ($scope, MathService) {

            $scope.result =  MathService.multiply(2,4);

        });
    </script>
</body>

</html>

service服务

服务是一个单一的JavaScript,它包含了一组函数对象来执行某些任务。服务使用service()函数,然后注入到控制器的定义。

定义一个模块

var mainApp = angular.module('mainApp', []);

创建 factory “MathService” 用于两数的乘积

mainApp.factory('MathService', function() {
   var factory = {};
   
   factory.multiply = function(a, b) {
      return a * b
   }
   return factory;
});

在 service 中注入 factory “MathService”

mainApp.service('CalcService', function(MathService){
   this.square = function(a) {
      return MathService.multiply(a,a);
   }
});

将"CalcService"注入到控制器

mainApp.controller('myCtrl', function ($scope, CalcService) {
 
$scope.result = CalcService.square(4);
      });

eg

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body>
    <div ng-app="mainApp" ng-controller="myCtrl">
        <p>{{ result }}</p>
    </div>
    <script>
        var mainApp = angular.module('mainApp', []);

        mainApp.factory('MathService', function () {
            var factory = {};

            factory.multiply = function (a, b) {
                return a * b
            }
            return factory;
        });

        mainApp.service('CalcService', function (MathService) {
            this.square = function (a) {
                return MathService.multiply(a, a);
            }
        });

        mainApp.controller('myCtrl', function ($scope, CalcService) {

            $scope.result = CalcService.square(4);

        });
    </script>
</body>

</html>

provider提供者与constant常量

提供者所使用的AngularJS内部创建过程中配置阶段的服务,工厂等。下面提到的脚本,可以用来创建,我们已经在前面创建MathService。提供者是一个特殊的工厂方法以及get()方法,用来返回值/服务/工厂。

定义一个模块

var mainApp = angular.module("mainApp", []);

用provider创建返回一个数的平方的服务

mainApp.config(function($provide) {
   $provide.provider('MathService', function() {
      this.$get = function() {
         var factory = {};  
         factory.multiply = function(a, b) {
            return a * b; 
         }
         return factory;
      };
   });
});

constant(常量)用来在配置阶段传递数值,注意这个常量在配置阶段是不可用的。

constant(name,value)可以将一个已经存在的变量值注册为服务,并将其注入到应用的其他部分中。其中,name为注册的常量的名字,value为注册的常量的值或对象。

value(7.2节)和constant区别:

1.value不可以在config里注入,但是constant可以

2.value可以修改,但是constant不可以修改,一般直接用constant配置一些需要经

常使用的数据。

eg

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>

<body>
    <div ng-app="mainApp" ng-controller="myCtrl">
        <p>{{ result }}</p>
    </div>
    
    <script>
        var mainApp = angular.module('mainApp', []);

        mainApp.config(function ($provide, configParam) {
            $provide.provider('MathService', function () {
                this.$get = function () {
                    var factory = {};
                    factory.multiply = function (a) {
                        return a * configParam;
                    }
                    return factory;
                };
            });
        });

        mainApp.constant("configParam", 5);


        mainApp.controller('myCtrl', function ($scope, MathService) {

            $scope.result = MathService.multiply(5);

        });
    </script>
</body>

</html>
<!DOCTYPE html>
<html>
<head>
      <title>依赖注入实例</title>
	<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
   </head>   
   <body>
      <h3>依赖注入</h3>     
      <div ng-app = "mainApp" ng-controller = "CalcController">

        <p>输入一个数字: <input type = "number" ng-model = "number" />
         <button ng-click = "square()">X<sup>2</sup></button>=
         <input type="text" value="{{result}}" />
         </p>

      </div>      
      <script>
         var mainApp = angular.module("mainApp", []);        
         mainApp.config(function($provide) {
            $provide.provider('MathService', function() {
               this.$get = function() {
                  var factory = {};                  
                  factory.multiply = function(a, b) {
                     return a * b;
                  }
                  return factory;
               };
            });
         });			
         mainApp.value("defaultInput", 10);         
         mainApp.factory('MathService', function() {
            var factory = {};            
            factory.multiply = function(a, b) {
               return a * b;
            }
            return factory;
         });         
         mainApp.service('CalcService', function(MathService){
            this.square = function(a) {
               return MathService.multiply(a,a);
            }
         });         
         mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
            $scope.number = defaultInput;
            $scope.result = CalcService.square($scope.number);
            $scope.square = function() {
               $scope.result = CalcService.square($scope.number);
            }
         });			
      </script>     
   </body>
</html>

blob.png

AngularJS 路由

AngularJS实现单页应用

(了解)angular.module函数

模块是应用程序中不同部分的容器。在深入AngularJS的模块之前,我们需要先了解一下Angular的一些基础知识。AngularJS是客户端技术,完全用JavaScript编写的,学习目的是让网 页应用开发更快更容易。AngularJS简化应用开发的一个重要方法是,将一些通用的低级开发操作包装起来提供给开发者。AngularJS会自动处理好这些低级操作,它们包括:

1)DOM操作

2)设置事件的监听

3)输入验证

在AngularJS简化开发的同时,它也为客户端带来了一些精巧的技术,它们包括:

1)数据、业务逻辑、视图的分离

2)数据和视图的自动绑定

3)通用服务

4)依赖注入

5)可扩展的HTML编译器(完全由JavaScript编写)

6)易于测试

同时,还可以用AngularJS来开发单页或者多页的应用,不过其主要还是用来开发单页的。 AngularJS支持浏览器的历史操作,向前,向后按钮,单页应用中的收藏操作。

模块定义了一个应用程序。大部分应用都有一个主方法用来实例化、组织、启动应用。AngularJS应用没有主方法,而是使用模块来声明应用应该如何启动。

你可以通过 AngularJS 的 angular.module函数来创建模块,例如:

image.png

单页应用的介绍

单页应用,就是只有一张Web页面的应用。单页应用程序是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的Web应用程序。浏览器一开始会加载必需的HTML、CSS和JavaScript,所有的操作都在这张页面上完成,都由JavaScript来控制。因此,对单页应用来说模块化的开发和设计显得相当重要。

特点

*速度:更好的用户体验,让用户在web app感受native app的速度和流畅,

*MVC:经典MVVM(即Model-View-ViewModel)开发模式,前后端各负其责。

*Ajax:重前端,业务逻辑全部在本地操作,数据都需要通过AJAX同步、提交。

*路由:在URL中采用#号来作为当前视图的地址,改变#号后的参数,页面并不会重载。

多页应用和单页应用模式的区别

单页模式打开方式:justep.shell.showpage();

多页模式打开方式:window.loacation.href = require.tourl();

image.png

image.png

单页应用的优缺点

单页Web程序的出现是富客户端发展的必然结果,但是该技术也是有些局限性,所以采用之前需要了解清楚它的优缺点。

1、优点:

1). 良好的交互体验

用户不需要重新刷新页面,获取数据也是通过Ajax异步获取,页面显示流畅。

2). 良好的前后端工作分离模式

单页Web应用可以和RESTful规约一起使用,通过REST API提供接口数据,并使用Ajax异步获取,这样有助于分离客户端和服务器端工作。更进一步,可以在客户端也可以分解为静态页面和页面交互两个部分。

3). 减轻服务器压力

服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍;

4). 共用一套后端程序代码

不用修改后端程序代码就可以同时用于Web界面、手机、平板等多种客户端;

2、缺点:

1). SEO(全称是Search Engine Optimization,搜索引擎优化)难度较高

由于所有的内容都在一个页面中动态替换显示,所以在SEO上其有着天然的弱势,所以如果你的站点对SEO很看重,且要用单页应用,那么就做些静态页面给搜索引擎用吧。

2). 前进、后退管理

由于单页Web应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能,所有的页面切换需要自己建立堆栈管理,当然此问题也有解决方案,比如利用URI中的散列+iframe实现。

3). 初次加载耗时多

为实现单页Web应用功能及显示效果,需要在加载页面的时候将JavaScript、CSS统一加载,部分页面可以在需要的时候加载。所以必须对JavaScript及CSS代码进行合并压缩处理,如果使用第三方库,建议使用一些大公司的CDN,因此带宽的消耗是必然的。

你需要知道的:

AngularJS是一个 MVC 框架,最适于开发客户端的单页面应用。它不是个功能库,而是用来开发动态网页的框架。它专注于扩展HTML的功能,提供动态数据绑定(data binding),而且它能跟其它框架(如jQuery)合作融洽。

如果你要开发的是单页应用,AngularJS就是你的上上之选。Gmail、Google Docs、Twitter和Facebook这样的应用,都很能发挥AngularJS的长处。但是像游戏开发之类对DOM进行大量操纵、又或者单纯需要极高运行速度的应用,就不是AngularJS的用武之地了。

AngularJS 路由 routing,能够从页面的一个视图跳转到另外一个视图,对单页面应用来讲是至关重要的。当应用变得越来越复杂时,我们需要一个合理的方式来管理用户在使用过程中看到的界面。AngularJS的做法是将视图分解成布局和模板视图,并且根据用户当前访问的URL来展示对应的视图。

路由结构

路由结构模板:

<script>
    angular.module('app', [])
        .config('$routeProvider', function ($routeProvider) {
            $routeProvider
                .when('/', {
                    templateUrl: 'view/home.html',
                    controller: 'homeCtrl'
                })
                .when('/', {
                    templateUrl: 'view/home.html',
                    controller: 'homeCtrl'
                })
                .when('/', {
                    templateUrl: 'view/home.html',
                    controller: 'homeCtrl'
                })
                .ontherwise({
                    redirective: '/'
                })
        })
</script>

config函数是一个配置函数,再使用$routeProvider这样的一个服务。

when:代表当你访问这个“/”根目录的时候 去访问 templateUrl中的那个模板。

controller可想已知,就是我们配套的controller,就是应用于根目录的这个模板时的controller。

ontherwise 就是当你路径访问错误时,如果找不到。最后跳到这个默认的页面。

一般在我们的index.html会有这么的一段代码:

<body ng-app='routingDemoApp'>
 
    <div ng-view></div>
 
</body>
<div ng-view></div>

就是我们注入的某个模板(template) 例如:

就相当于注入叫做abc.html的模板。ng-view这个指令优先级是1000的终极指令,就是说权限很高。

在注入这个abc.html的模板的时候。我们一般都用了路由设置,路由相当于一个遥控器。这个ng-view就是一部电视机。如果某个模板同当前的路由相关联:

  1 创建一个新的作用域;(用路由(遥控器)打开某个电视台)

  2 移除上一个视图,同时上一个作用域也会被清除;(换台,什么都没了)

  3 将新的作用域同当前模板关联在一起;(电视机播放新的电视台)

  4 如果路由中有相关的定义,那么就把对应的控制器同当前作用域关联起来;

  5 触发$viewContentLoaded事件;(判断页面是否渲染完成)

   6 如果提供了onload属性,调用该属性所指定的函数。

eg

<!DOCTYPE html>
<html>
<head>
    	<meta charset="utf-8">
        <title>AngularJS 路由</title>
	    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
        <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
    </head>
    <body ng-app='routingDemoApp'>
     
        <h3>AngularJS 路由实例</h3>
        <ul>
            <li><a href="#/">首页</a></li>
            <li><a href="#/php">PHP</a></li>
            <li><a href="#/seo">SEO</a></li>
            <li><a href="#/h5">H5</a></li>
        </ul>
    
         
        <div ng-view></div>

        <script>
            angular.module('routingDemoApp',['ngRoute'])
            .config(['$routeProvider', function($routeProvider){
                $routeProvider
                .when('/',{template:'网站首页'})
                .when('/php',{template:'开发WEB最好的语言'})
                .when('/seo',{template:'搜索引擎优化'})
                .otherwise({redirectTo:'/'});
            }]);
        </script>
    </body>
</html>

$stateProvider

angular.module('app',[])
.config(function($stateProvider){
$stateProvider.state(stateName, stateCofig);
})

$stateProvider.state

在$stateProvider.state(stateName, stateConfig)中,

stateName是string类型,stateConfig是object类型。

//statConfig可以为空对象

$stateProvider.state(“home”,{});

//state可以有子父级

$stateProvider.state(“home”,{});

$stateProvider.state(“home.child”,{})

//state可以是链式的

$stateProvider.state(“home”,{}).state(“about”,{}).state(“photos”,{});

stateConfig包含的字段:template, templateUrl, templateProvider, controller, controllerProvider, resolve, url, params, views, abstract, onEnter, onExit, reloadOnSearch, data。

$state.go

在$state.go(to, [,toParams],[,options])中,

形参to是string类型,必须,使用"^“或”."表示相对路径;

形参toParams可空,类型是对象;

形参options可空,类型是对象,字段包括:location为bool类型默认true,inherit为bool类型默认true, relative为对象默认 s t a t e . state. state.current,notify为bool类型默认为true, reload为bool类型默认为false。

$state.go(‘photos.detail’)

$state.go(‘^’)到上一级,比如从photo.detail到photo

$state.go(‘^.list’)到相邻state,比如从photo.detail到photo.list

$state.go(‘^.detail.comment’)到孙子级state,比如从photo.detail到photo.detial.comment

路由配置对象

$routeProvider

image.png

config:函数是一个配置函数,再使用$routeProvider这样的一个服务。

when:代表当你访问这个“/”根目录的时候 去访问 templateUrl中的那个模板。

controller:可想已知,就是我们配套的controller,就是应用于根目录的这个模板时的controller。

otherwise:就是当你路径访问错误时,如果找不到。最后跳到这个默认的页面。

image.png

,就是我们注入的某个模板(template) 例如:
就相当于注入叫做abc.html的模板。ng-view这个指令优先级是1000的终极指令,就是说权限很高。

在注入这个abc.html的模板的时候。我们一般都用了路由设置,路由相当于一个遥控器。这个ng-view就是一部电视机。如果某个模板同当前的路由相关联:

1 创建一个新的作用域;(用路由(遥控器)打开某个电视台)

2 移除上一个视图,同时上一个作用域也会被清除;(换台,什么都没了)

3 将新的作用域同当前模板关联在一起;(电视机播放新的电视台)

4 如果路由中有相关的定义,那么就把对应的控制器同当前作用域关联起来;

5 触发$viewContentLoaded事件;(判断页面是否渲染完成)

6 如果提供了onload属性,调用该属性所指定的函数。

路由配置对象

AngularJS 路由也可以通过不同的模板来实现。$routeProvider.when() 函数的第一个参数是 URL 或者 URL 正则规则,第二个参数为路由配置对象。

路由配置对象语法:

$routeProvider.when(url, {
    template: string,
    templateUrl: string,
    controller: string, function 或 array,
    controllerAs: string,
    redirectTo: string, function,
    resolve: object<key, function>
});

controllerAs为controller指定别名。

redirectTo设定重定向的地址。

resolve,指定当前controller所依赖的其他模块。

eg

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>路由配置对象</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
    <script type="text/javascript">
        angular.module('ngRouteExample', ['ngRoute'])
            .controller('HomeController', function ($scope) {
                $scope.$route = $route;
            })
            .controller('AboutController', function ($scope) {
                $scope.$route = $route;
            })
            .config(function ($routeProvider) {
                $routeProvider.
                when('/home', {
                    templateUrl: 'embedded.home.html',
                    controller: 'HomeController'
                }).
                when('/about', {
                    templateUrl: 'embedded.about.html',
                    controller: 'AboutController'
                });
            });
    </script>

</head>

<body ng-app="ngRouteExample" class="ng-scope">
    <script type="text/ng-template" id="embedded.home.html">
        <h1> 首页 </h1>
    </script>
    <script type="text/ng-template" id="embedded.about.html">
        <h1>关于我们 </h1>
    </script>
    <div>
        <div id="navigation">
            <a href="#/home">首页</a>
            <a href="#/about">关于我们</a>
        </div>

        <div ng-view="">
        </div>
    </div>
</body>

</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpLbLHam-1672105120199)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20221226161945454.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ELHriv2-1672105120199)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20221226161956015.png)]

eg.

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
    <div ng-controller="myCtrl">
        <ul>
            <li><a href="#/a">click a</a></li>
            <li><a href="#/b">click b</a></li>
        </ul>

        <ng-view></ng-view>
    </div>
    <script type="text/javascript">
    angular.module("myApp",["ngRoute"])
    .controller("aController",function($scope,$route){
        $scope.hello = "hello,a!";
    })
    .controller("bController",function($scope){
        $scope.hello = "hello,b!";
    })
    .controller("myCtrl",function($scope,$location){

        $scope.$on("$viewContentLoaded",function(){
            console.log("ng-view content loaded!");
        });

        $scope.$on("$routeChangeStart",function 
(event,next,current){
            //event.preventDefault(); //cancel url change
            console.log("route change start!");
        });
    })
    .config(function($routeProvider, $locationProvider) {
          $routeProvider
           .when('/a', {
            templateUrl: 'a.html',
            controller: 'aController'
          })
        .when('/b', {
            templateUrl: 'b.html',
            controller: 'bController',
            resolve: {
                  // I will cause a 1 second delay
                  delay: function($q, $timeout) {
                    var delay = $q.defer();
                    $timeout(delay.resolve, 1000);
                    return delay.promise;
                  }
            }
        })
        .otherwise({
            redirectTo: '/a'
          });
    });
    </script>
</body>
</html>
 <a.html> 
<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
  <div ng-controller="aController" style="height:300px;width:100%;background-color:green;">
    {{hello}}
</div>
</body>
</html>



 <b.html> 
 <!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
  <div ng-controller="bController" style="height:300px;width:100%;background-color:blue;">
    {{hello}}
</div>
</body>
</html>

blob.png

g-PpLbLHam-1672105120199)]

[外链图片转存中…(img-0ELHriv2-1672105120199)]

eg.

<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
    <div ng-controller="myCtrl">
        <ul>
            <li><a href="#/a">click a</a></li>
            <li><a href="#/b">click b</a></li>
        </ul>

        <ng-view></ng-view>
    </div>
    <script type="text/javascript">
    angular.module("myApp",["ngRoute"])
    .controller("aController",function($scope,$route){
        $scope.hello = "hello,a!";
    })
    .controller("bController",function($scope){
        $scope.hello = "hello,b!";
    })
    .controller("myCtrl",function($scope,$location){

        $scope.$on("$viewContentLoaded",function(){
            console.log("ng-view content loaded!");
        });

        $scope.$on("$routeChangeStart",function 
(event,next,current){
            //event.preventDefault(); //cancel url change
            console.log("route change start!");
        });
    })
    .config(function($routeProvider, $locationProvider) {
          $routeProvider
           .when('/a', {
            templateUrl: 'a.html',
            controller: 'aController'
          })
        .when('/b', {
            templateUrl: 'b.html',
            controller: 'bController',
            resolve: {
                  // I will cause a 1 second delay
                  delay: function($q, $timeout) {
                    var delay = $q.defer();
                    $timeout(delay.resolve, 1000);
                    return delay.promise;
                  }
            }
        })
        .otherwise({
            redirectTo: '/a'
          });
    });
    </script>
</body>
</html>
 <a.html> 
<!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
  <div ng-controller="aController" style="height:300px;width:100%;background-color:green;">
    {{hello}}
</div>
</body>
</html>



 <b.html> 
 <!DOCTYPE html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8" />
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
</head>
<body>
  <div ng-controller="bController" style="height:300px;width:100%;background-color:blue;">
    {{hello}}
</div>
</body>
</html>

[外链图片转存中…(img-Pr6b9aQE-1672105120200)]

blob.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值