简单入门 下载与使用 下载地址:https://angularjs.org,点 DEVELOP / Download,找到 angularjs-1.x.x.zip 为全部文件
引入文件
1 <script src ="js/angular.js" > </script >
数据绑定 ng-app 1 2 3 4 5 6 7 8 9 10 11 12 <html > <head > <meta charset ="UTF-8" > <title > </title > <script src ="js/angular.js" > </script > </head > <body > <div ng-app > <h1 > {{1+2}}</h1 > </div > </body > </html >
ng-app
表示Angular的作用于,在一个HTML文档中有且只能有一个。如果有多个,以第一个为准。所以ng-app
一般放在<html>
标签中。
可以使用 <html ng-app>
,也可以是 <html ng-app="">
Angular中数据使用双花括号{\{}\}
表示数据
ng-init 声明变量并赋初值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <html ng-app > <head > <meta charset ="UTF-8" > <title > </title > <script src ="js/angular.js" > </script > </head > <body > <h1 > {{1+2}}</h1 > <h1 ng-init ="a=1; b='字符串'; c={'name':'张三', 'age':18}" > </h1 > <h2 > {{a}}</h2 > <h2 > {{"a"}}</h2 > <h2 > 姓名:{{c.name}}</h2 > <h2 > 年龄:{{c.age}}</h2 > </body > </html >
ng-model 数据与HTML元素绑定,修改元素内容则修改对应数据,以及所有显示该数据的元素
<element ng-model="name"></element>
<input>
/<select>
/<textarea>
元素支持该指令
1 2 3 4 5 <h1 ng-init ="p={'name':'张三', 'age':18}" > </h1 > <h2 > 姓名:{{p.name}}</h2 > <h2 > 年龄:{{p.age}}</h2 > <input type ="text" ng-model ="p.name" /> <input type ="number" ng-model ="p.age" />
模块和控制器 模块的创建 语法:angular.module("app", []);
其中”app”是HTML中唯一一个ng-app="app"
的值
依赖:require(字符串数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <html ng-app ="app" > <head > <meta charset ="UTF-8" > <title > </title > <script src ="js/angular.js" > </script > </head > <body > </body > <script > angular.module('app' , []); </script > </html >
控制器 $scope
绑定的是数据模型,可直接使用 $scope.xxx
1 2 3 4 5 6 7 8 9 10 11 <body ng-controller ="ctrl" > <h1 > {{name}}</h1 > </body > <script > var myApp = angular.module('app' , []); myApp.controller("ctrl" , ["$scope" , function ($scope) { $scope.name = '张三' ; }]); </script >
常用指令 ng-repeat 循环输出指定次数的HTML元素,集合必须是数组或对象
方式1:item in list
方式2:(key, value) in list
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <body ng-controller ="ctrl" > <ul > <li ng-repeat ="s in scores" > <h2 > {{s.name}}-{{s.score}}</h2 > </li > </ul > <hr > <ul > <li ng-repeat ="(key, value) in person" > <h2 > {{key}}-{{value}}</h2 > </li > </ul > <hr > <ul > <li ng-repeat ="s in scores" > <h2 ng-repeat ="(key, value) in s" > {{key}}-{{value}} </h2 > </li > </ul > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.scores = [ { "name" : "语文" , "score" : 88 }, { "name" : "数学" , "score" : 100 }, { "name" : "英语" , "score" : 98 } ]; $scope.person = {"name" : "张三" , "age" : 18 }; }]); </script >
1 2 3 4 5 6 7 8 9 10 11 12 13 ·语文-88 ·数学-100 ·英语-98 --------- ·name-张三 ·age-18 --------- ·name-语文 score-88 ·name-数学 score-100 ·name-英语 score-98
循环索引 所有下标都是从 0 开始
$index
循环的索引
$first
是否是第一项
$last
是否是最后一项
$middle
是否是中间项(非第一、最后第一)
$odd
下标是否是奇数(第0项false )
$even
下标是否是偶数(第0项true )
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 27 <body ng-controller ="ctrl" > <div class ="container" > <table class ='table table-bordered' > <tr ng-repeat ="item in list" > <td > {{$index}}</td > <td > {{item.name}}</td > <td > {{item.age}}</td > <td > {{$first}}</td > <td > {{$odd}}</td > </tr > </table > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.list = [ {'name' : '张三1' , 'age' : 18 }, {'name' : '张三2' , 'age' : 18 }, {'name' : '张三3' , 'age' : 18 }, {'name' : '张三4' , 'age' : 18 }, {'name' : '张三5' , 'age' : 18 }, ]; }]); </script >
ng-class 给HTML元素动态绑定一个或多个CSS类
如果值是字符串,多个类名用空格分隔
如果值是对象,需要使用 key-value 的方式,key 为要添加的类名,value 是布尔值,仅在为 true 时添加
如果值是数组,可以由字符串或对象组合组成,数组的元素可以是字符串或对象
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 27 28 29 30 <html ng-app ="app" > <head > <meta charset ="UTF-8" > <title > </title > <link rel ="stylesheet" href ="css/bootstrap.min.css" /> <script src ="js/angular.js" > </script > </head > <body ng-controller ="ctrl" > <div class ="container" > <div ng-class =" 'btn-primary text-center' " > 方式1</div > <div ng-class ="{ 'bg-info': true }" > 方式2.1</div > <div ng-class ="{ 'bg-info': isAdd }" > 方式2.2</div > <div ng-class ="[ 'btn-primary', 'text-right' ]" > 方式3</div > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.isAdded = false ; }]); </script > </html >
ng-click 元素被点击后需要执行的操作,所有 HTML 元素都支持
<element ng-click="express"></element>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <body ng-controller ="ctrl" > <div class ="container" > <div class ="btn btn-primary" ng-click ="temp=!temp" > 点击后切换下面H1的class的开关 </div > <h1 ng-class ="{ 'bg-primary': temp, 'bg-danger': !temp }" > 使用对象的方式开关类 </h1 > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.temp = true ; }]); </script >
function 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <body ng-controller ="ctrl" > <div class ="container" > <h1 ng-class ="{ 'btn-primary': temp }" > {{name}}</h1 > <div class ="btn btn-success" ng-click ="name='李四'" > 修改姓名</div > <div class ="btn btn-success" ng-click ="change()" > 修改姓名2</div > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.name = "张三" ; $scope.temp = false ; $scope.change=function () { $scope.name = "王五" ; $scope.temp = true ; }; }]); </script >
元素的显示与隐藏 ng-show、ng-hide
元素的显示或隐藏时通过改变CSS的display属性值来实现的
1 <h1 ng-show ="false" > </h1 >
ng-show=false
或 ng-hide=true
时,会自动给元素添加上:class="ng-hide"
ng-if 在表达式为 false 时移除 HTML 元素;true 时会添加 移除的元素并显示
ng-if 不同于 ng-hide。ng-hide 是隐藏元素,而 ng-if 是从 DOM 中移除元素
1 2 3 4 <body ng-controller ="ctrl" ng-init ="check=true" > <h1 ng-if ="check==true" > 文字文字</h1 > <button ng-click ="check = !check" > 按钮</button > </body >
ng-switch 根据表达式显示或隐藏对应的部分。
ng-switch-when
: 如果匹配选中选择显示
ng-switch-default
: 如果都没有匹配,则默认显示
1 2 3 4 5 6 7 8 <body ng-controller ="ctrl" ng-init ="val='b'" > <div ng-switch ="val" > <h1 ng-switch-when ="a" > 选项一</h1 > <h1 ng-switch-when ="b" > 选项二</h1 > <h1 ng-switch-when ="c" > 选项三</h1 > <h1 ng-switch-default > 默认</h1 > </div > </body >
不同控制器的数据共享 父子关系
子controller
/ $scope
可以继承父 controller
的 $scope
对象
子controller
的 $scope
同名字段会替换掉父容器的同名字段
父级 controller
里定义一个方法,操作父级的 scope 对象,在子级 controller
里调用该方法,实现了子父通讯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <body ng-controller ="ctrl" > <h1 > 父级的标题-{{myTitle}}</h1 > <div ng-controller ='innerCtrl' > <h1 > 子级的标题-{{myTitle}}</h1 > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.myTitle = '父级的标题' ; }]); myApp.controller('innerCtrl' , ["$scope" , function ($scope) { }]); </script >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <body ng-controller ="ctrl" > <h1 > 父级的标题-{{myTitle}}</h1 > <div ng-controller ='innerCtrl' > <h1 > 子级的标题-{{myTitle}}</h1 > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.myTitle = '父级的标题' ; }]); myApp.controller('innerCtrl' , ["$scope" , function ($scope) { $scope.myTitle = '子级的标题' ; }]); </script >
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 27 28 <body ng-controller ="ctrl" > <h1 > 父级的标题-{{myTitle}}</h1 > <span class ="btn btn-primary" ng-click ="changeTitle()" > 点击切换标题</span > <div ng-controller ='innerCtrl' > <h1 > 子级的标题-{{myTitle}}</h1 > <span class ="btn btn-primary" ng-click ="changeTitle()" > 点击切换标题</span > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.myTitle = '父级的标题' ; $scope.changeTitle = function () { $scope.myTitle = '父级的标题2' ; } }]); myApp.controller('innerCtrl' , ["$scope" , function ($scope) { $scope.myTitle = '子级的标题' ; $scope.changeTitle = function () { $scope.myTitle = '子级的标题2' ; } }]); </script >
$rootScope
scope
是html和单个controller之间的桥梁,数据绑定就靠他了。rootscope
是各个controller中的桥梁。用rootscope
定义的值,可以在各个controller中使用
$rootScope
是由angularjs加载模块的时候自动创建的,每个模块只会有1个rootScope
。
简而言之:$rootScope
就是全局对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <body > <div ng-controller ="ctrl" > <h1 > {{title}}</h1 > <h1 > {{content}}</h1 > </div > <div ng-controller ="ctrl2" > <h1 > {{title}}</h1 > <h1 > {{content}}</h1 > </div > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , "$rootScope" , function ($scope, $rootScope) { $scope.title='控制器一' ; $rootScope.content='全局rootScope内容' ; }]); myApp.controller('ctrl2' , ["$scope" , function ($scope) { }]); </script >
监听变化 $watch 用于监听模型的变化
$watch(watchExpression, listener, objectEquality);
参数一:监听的对象,可以是表达式如'name'
,或函数function() { return $scope.name }
参数二:变化时要调用的函数或表达式,接收三个参数:
参数一:newValue 新值
参数二:oldValue 旧值(watchExpression 表达式的值)
参数三:scope 作用域
参数三:是否深度监听。若true,则检查所监控的对象中每一个属性的变化。 如果要监控数组的个别元素或者对象的属性而不是一个普通的值,那么应该使用他
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.title = 'a' ; $scope.title2 = 'b' ; $scope.$watch('title==title2' , function (newVal, oldVal, scope) { }); $scope.user = { "name" : "张三" , "age" : 20 }; $scope.$watch('user' , function (newVal, oldVal, scope) { console .log(JSON .stringify(newVal)); }); }]); </script >
$apply
传播 module
变化
1 2 3 4 5 6 7 8 myApp.controller('ctrl' , ["$scope" , function ($scope ) { $scope.num = 0 ; setInterval(function ( ) { $scope.num++; }, 1000 ); }]);
1 2 3 4 5 6 7 8 myApp.controller('ctrl' , ["$scope" , function ($scope ) { $scope.num = 0 ; setInterval(function ( ) { $scope.$apply(function ( ) { $scope.num++; }); }, 1000 ); }]);
1 2 3 4 5 6 7 8 9 myApp.controller('ctrl' , ["$scope" , "$interval" , function ($scope, $interval ) { $scope.num = 0 ; var timer = $interval(function ( ) { $scope.num++; if ($scope.num == 10 ) $interval.cancel(timer); }, 1000 ); }]);
$ng-bind 使用给定的变量或表达式的值来替换 HTML 元素的内容
如果给定的变量或表达式修改了,指定替换的 HTML 元素也会修改
nb-bind
作用和{\{}\}
是一样的
用双大括号的形式,浏览器会先加载HTML,再加载Angular。在网速慢或反应慢的时候,会先短暂出现一大堆的{\{}\}
,再消失
1 2 <h1 > {{title}}</h1 > <h1 ng-bind ="title" > </h1 >
框架搭建 表单验证
ng-minlength
最小长度
ng-maxlength
最大长度
ng-required
是否是必填项
ng-pattern
正则匹配
ng-disabled
指令设置表单输入字段的disabled属性(input, select, textarea),true时禁用
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 27 28 29 30 31 32 33 <form name ="form1" > <div class ="form-group" > <label class ="col-sm-2 control-label" > 用户名</label > <div class ="col-sm-5" > <input type ="text" name ="User" ng-model ="UserName" class ="form-control" ng-minlength ="4" ng-maxlength ="20" ng-required ="true" /> </div > <div class ="col-sm-5" > <p class ="form-control-static" ng-show ="form1.User.$invalid" > 请输入4-20位用户名</p > </div > </div > <div class ="form-group" > <label class ="col-sm-2 control-label" > 手机号</label > <div class ="col-sm-5" > <input type ="tel" name ="tel" ng-model ="tel" class ="form-control" ng-model ="tel" ng-pattern ="/1[3578]\d{9}/" ng-required ="true" /> </div > <div class ="col-sm-5" > <p class ="form-control-static" ng-show ="form1.tel.$error.required" > 手机号不能为空</p > <p class ="form-control-static" ng-show ="form1.tel.$error.pattern" > 请输入正确的手机号</p > </div > </div > <div class ="form-group" > <div class ="col-sm-offset-2 col-sm-10" > <button type ="submit" class ="btn btn-primary" ng-disabled ="form1.$invalid" > 注册</button > </div > </div > </form >
ng-option 在表达式中使用数组来字段生成一个select中的option列表
用法:
是一个数组 时:
1 $scope.names = ["Email", "Tobias", "Linus"];
item for item in names
是一个对象数组 时
1 2 3 4 $scope.colors = [ {id:1, name:'black', shade:'dark'}, {id:2, name:'white', shade:'light'} ];
c.name for c in colors
使用name作为列表
c.id as c.name for c in colors
显示name,但是value是id;不加as则默认值为对象JSON
c.id as c.name group by c.shade for c in colors
通过某一数组分组(二层树状)
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 27 28 29 30 <body ng-controller ="ctrl" > <select class ="form-control" ng-options ="a for a in names" ng-model ="name" > </select > <select class ="form-control" ng-options ="a for a in names" ng-model ="name" > <option value ="" > --请选择--</option > </select > <hr > <select class ="form-control" ng-options ="color.id as color.name for color in colors" ng-model ="color" > </select > <h1 > 选中了{{color}}</h1 > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.names = ["张三" , "李四" , "王五" ]; $scope.name = "张三" ; $scope.colors = [ { id: 1 , name: 'black' , shade: 'dark' }, { id: 2 , name: 'white' , shade: 'light' } ]; $scope.color='' ; }]); </script >
过滤器 filter,用来过滤变量的值,或者格式化输出,得到自己所期望的结果或格式
filter格式
data|filter
数据源|过滤器名称
data|filter:params
数据源|过滤器名称:过滤器参数
data|filter:param1:param2
添加多个参数
data|filter1:param|filter2:param
添加多个过滤器
常用过滤器
currency
数值格式化为货币格式,并自动每3位加逗号。{\{123 | currency}\}
data
日期格式化成需要的格式
number:num
用来精确浮点数,默认保留3位
limitTo:num
数据的截取
Lowercase\uppercase
大小写过滤器
1 2 3 4 5 6 7 8 9 <h1 > 货币符号过滤器:{{100|currency}}</h1 > <h1 > 货币符号过滤器:{{100|currency:"¥"}}</h1 > <h1 > 日期过滤器:{{now}}</h1 > <h1 > 日期过滤器:{{now|date:"yyyy-MM-dd HH:mm:ss"}}</h1 > <h1 > number过滤器:{{100.123456|number:2}}</h1 > <h1 > limitTo过滤器:{{"文本左边截取"|limitTo:3}}</h1 > <h1 > 小写过滤器:{{"aaaBBB"|lowercase}}</h1 > <h1 > 大小过滤器:{{"aaaBBB"|uppercase}}</h1 > <h1 > 多个一起用:{{"aaaBBB"|uppercase|limitTo:4}}</h1 >
1 2 3 4 var myApp = angular.module('app' , []);myApp.controller('ctrl' , ["$scope" , function ($scope ) { $scope.now = new Date (); }]);
orderBy 格式:data|orderby:param
参数:
排序字段
是否逆向排序,true为逆向,默认false
“-字段”该字段逆向
排序规则:
数字:从小到大
字符串:按照字母表排,数字优先级大于字母
汉字:按照字库排序,不是按照拼音
1 2 3 4 5 <tr ng-repeat ="i in list|orderBy:'name'" > <td > {{i.id}}</td > <td > {{i.name}}</td > <td > {{i.type}}</td > </tr >
1 2 <tr ng-repeat ="i in list|orderBy:'type':true" > <tr ng-repeat ="i in list|orderBy:'-type'" >
1 <tr ng-repeat ="i in list|orderBy:['type','-id']" >
点击标题修改排序方式、顺序逆序:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <body ng-controller ="ctrl" > <table class ="table table-bordered" > <thead > <tr > <td ng-click ="clickOrder('id')" > ID</td > <td ng-click ="clickOrder('name')" > name</td > <td ng-click ="clickOrder('type')" > type</td > </tr > </thead > <tbody > <tr ng-repeat ="l in list|orderBy:orderType:reverse" > <td > {{l.id}}</td > <td > {{l.name}}</td > <td > {{l.type}}</td > </tr > </tbody > </table > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.orderType = 'id' ; $scope.reverse = false ; $scope.list = [ {"id" : 1 , "name" : "北京" , "type" : "a" }, {"id" : 2 , "name" : "上海" , "type" : "b" }, {"id" : 3 , "name" : "山东" , "type" : "a" }, {"id" : 4 , "name" : "江苏" , "type" : "b" }, {"id" : 5 , "name" : "浙江" , "type" : "b" }, ]; $scope.clickOrder = function (o) { if ($scope.orderType == o) { $scope.reverse = !$scope.reverse; } else { $scope.reverse = false ; $scope.orderType = o; } } }]); </script >
filter 格式:data|filter:param
第一个参数为字符串表示会搜索所有的字段
第一个参数为对象 {"key":""}
,key 为字段名称,只查找该字段
{"$":""}
全属性查找
第二个参数为true时表示精确匹配;否则模糊匹配
列表关键词过滤示例 :
检测item的字段:根据 search 里面的内容,过滤下方 ul 的项目
1 2 3 4 5 6 <input type ="text" class ="form-control" ng-model ="search" /> <ul class ="list-group" > <li class ="list-group-item" ng-repeat ="l in list|filter:search" > <p > {{l.id}}-{{l.name}}-{{l.type}}</p > </li > </ul >
只过滤一个字段:
1 <li class ="list-group-item" ng-repeat ="l in list|filter:{'name':search}" >
全属性中过滤(相等于不用字段):
1 <li class ="list-group-item" ng-repeat ="l in list|filter:{'$':search}" >
精确匹配:某一字段完全等于search值
1 <li class ="list-group-item" ng-repeat ="l in list|filter:search:true" >
省-市 过滤示例:
1 2 3 4 5 6 7 <select ng-model ="province" ng-options ="item.id as item.name for item in provinceList" > <option value ="" > --请选择省份--</option > </select > <select ng-model ="city" ng-options ="item.id as item.name for item in cityList|filter:{'provinceId':province}" > <option value ="" > --请选择县市--</option > </select >
自定义过滤器 1 2 3 4 5 App.filter("filterName" , [function ( ) { return function (data ) { return data; } }])
示例:
1 2 3 4 5 6 7 8 9 10 11 12 myApp.filter("round" , [function ( ) { return function (data ) { return Math .round(data); } }]); myApp.filter("multi" , [function ( ) { return function (data, arg1 ) { return data * arg1; } }]);
路由 使用路由需要引入第三方的js: angular-route.js
1 <script src="js/angular-route.js"></script>
配置路由 模块的config
函数里面,需要依赖注入$routeProvider
1 2 3 4 5 6 7 8 var myApp = angular.module('app' , ["ngRoute" ]);myApp.config(["$routeProvider" , function ($routeProvider ) { $routeProvider.when("路由地址" , { template: "" , templateUrl: "" , controller: "" , }); }])
template 简单路由示例:
使用 ng-view
自动适应对应的 template
或 templateUrl
,并套上对应的 controller
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <html ng-app ="app" > <head > <meta charset ="UTF-8" > <link rel ="stylesheet" href ="css/bootstrap.min.css" /> <script src ="js/angular.js" > </script > <script src ="js/angular-route.js" > </script > </head > <body ng-controller ="ctrl" > <nav class ="navbar navbar-inverse" > <ul class ="nav navbar-nav" > <li > <a href ="#!" > 首页</a > </li > <li > <a href ="#!/list" > 列表</a > </li > <li > <a href ="#!/func" > 功能</a > </li > </ul > </nav > <div class ="container" > <div ng-view > </div > </div > </body > <script > var myApp = angular.module('app' , ["ngRoute" ]); myApp.config(["$routeProvider" , function ($routeProvider) { $routeProvider.when("/" , { template: "<h1 > 首页的内容</h1 > ", }).when("/list" , { "template" : "<h1>列表的内容</h1>" , }).when("/func" , { "template" : "<h1>功能的内容</h1>" , }).otherwise("/" ); }]); myApp.controller('ctrl' , ["$scope" , function ($scope) { }]); </script > </html >
templateUrl 路由至单独页面、每个页面单独的控制器:
注意:templateUrl 方式需要用 localhost/file.html
访问,浏览器直接读取本地文件将无效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var myApp = angular.module('app' , ["ngRoute" ]);myApp.config(["$routeProvider" , function ($routeProvider ) { $routeProvider.when("/" , { templateUrl: "view/home.html" , controller: "homeCtrl" , }).when("/list" , { "templateUrl" : "view/list.html" , controller: "listCtrl" , }).when("/func" , { "templateUrl" : "view/func.html" , controller: "funcCtrl" , }).otherwise("/" ); }]); myApp.controller("homeCtrl" , ["$scope" , function ($scope ) { }]); myApp.controller("listCtrl" , ["$scope" , function ($scope ) { }]); myApp.controller("funcCtrl" , ["$scope" , function ($scope ) { }]);
路由传参 配置路由时路径 path/:param1/:param2
获取参数:在控制器里面依赖注入 $routeParams
,使用 $routeParams.param1
来获取参数
1 2 3 4 <a ng-init ="name='test'" > <a href ="#!/detail/:'hhh'" > 查看详情</a > <a href ="#!/detail/:name" > 查看详情</a >
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 <script > var myApp = angular.module('app' , ["ngRoute" ]); myApp.config(["$routeProvider" , function ($routeProvider) { $routeProvider.when("/" , { "templateUrl" : "view/home.html" , "controller" : "homeCtrl" }).when("/list" , { "templateUrl" : "view/list.html" , "controller" : "listCtrl" }).when("/func" , { "templateUrl" : "view/func.html" , "controller" : "funcCtrl" }).when("/detail/:name" , { "templateUrl" : "view/detail.html" , "controller" : "detailCtrl" }).otherwise("/list" ); }]); myApp.controller("detailCtrl" , ["$scope" , "$routeParams" , function ($scope, $routeParams) { $scope.name = $routeParams.name; }]); </script >
服务 所有服务都不能HTML中直接使用,必须要和控制器scope的某个值绑定
也可以把整个服务赋值给控制器成员变量,则相当于直接使用
factory 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var myApp = angular.module('app' , []);myApp.controller('ctrl' , ["$scope" , "myService" , function ($scope ) { $scope.msg = myService.msg; $scope.num = myService.num; $scope.sum = myService.sum(1 ,2 ); }]); myApp.factory("myService" , ["number" , function ( ) { return { "msg" : "hello" , "num" : 10 , "sum" : function (a, b ) { return a + b * number.multi; } }; }]); myApp.factory("number" , [function ( ) { return { multi:20 } }]);
service 同factory
,只是把返回的数组改用this
1 2 3 4 5 myApp.service("myService" , [function ( ) { this .sum = function (a, b ) { return a + b; } }]);
constant 一般常量用 constant 和 value
constant 一般用作不做修改的全局变量
1 2 3 4 5 6 7 8 myApp.controller("ctrl" , ["$scope" , "config" , function ($scope, config ) { $scope.config = config; }]); myApp.constant("myConfig" , { "version" : "1.2.0" , "bgColor" : "red" });
value 1 2 3 myApp.value("data" , { "num" : 10 });
provider 类似service服务,不过分成了两部分
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 myApp.config(["calcProvider" , function ( ) { console .log(calcProvider.msg); }]); myApp.controller("ctrl" , ["$scope" , "calc" , function ($scope, calc ) { $scope.num = calc.sum(1 , 2 ); }]); myApp.service("calc" , [function ( ) { this .msg = "" ; this .num = 10 ; this .$get = function() { return { sum: function (a, b ) { return a + b; } }; } }]);
自定义指令 可以理解成在特定DOM元素上运行的函数,指令可以扩展成这个元素的功能
1 2 3 4 5 6 angular.module('myApp' , []) .directive('myDirective' , [function ( ) { return { restrict: "ESMA" , }; }]);
restrict、template、replace
restrict
调用方式,值为:
E
: 标签调用
A
: 属性调用
C
: 类名调用
M
: 注释调用
template
模板HTML
模板必须有一个根元素,即最外层不能多个标签并行(包括 templateUrl 的文件)
replace
指令标记是否被替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <body > <hello-dir > E元素标签</hello-dir > <div hello-dir > A属性方式</div > <div class ="hello-dir" > C类名方式</div > </body > <script > var myApp = angular.module('app' , []); myApp.directive('helloDir' , [function () { return { "restrict" : "ESMA" , "template" : "<h1>Hello, Directory</h1>" , "replace" : true }; }]); </script >
templateURL
方式一:值为HTML路径
1 2 3 4 5 6 7 8 myApp.directive('hello' , [function ( ) { return { "restrict" : "E" , "templateUrl" : "view/link.html" , "replace" : true }; }]);
方式二:页面里添加一个script
标签,type
属性为:text/ng-template
,id
属性值自己定义,templateUrl
的值就是这个script
标签的id
属性值(通过 id
进行关联)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <body > <hello > 元素标签的形式</hello > </body > <script > var myApp = angular.module('app' , []); myApp.directive('hello' , [function () { return { "restrict" : "ECMA" , "templateUrl" : "tpl1" }; }]); </script > <script type ="text/ng-template" id ="tpl1" > <h1 > 第二种模板</h1 > </script >
transclude boolean,保留指令标记原有内容。默认 false(覆盖原内容)
true 时原有内容被保留在模板页里有 ng-transclude
指令的元素中
main.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <body > <hello > <a > 原有的内容</a > </hello > </body > <script > var myApp = angular.module('app' , []); myApp.directive('hello' , [function () { return { "restrict" : "E" , "templateUrl" : "view/link.html" , "transclude" : true }; }]); </script >
link.html
1 2 3 4 <div > <div > 模板内容 </div > <div ng-transclude > </div > </div >
scope
指令的scope
有三种选择:
false
(默认)
可以直接使用父作用域中的变量,共享同一个model
,修改数据会反映到父作用域 即标签中使用ng-model
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 27 28 29 30 <body ng-controller ="ctrl" > <h1 > {{title}}</h1 > <input type ="text" ng-model ="name" /> <hello > </hello > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.name = "张三" ; }]); myApp.directive('hello' , [function () { return { "restrict" : "E" , "templateUrl" : "view/link.html" , "controller" : ["$scope" , function ($scope) { $scope.title = "标题" ; }], }; }]); </script > <div > <h1 > {{title}}</h1 > <input type ="text" ng-model ="name" /> </div >
true
创建一个新的作用域,继承自父作用域。
{}
创建与父作用域隔离的新作用域,使在不知道外部环境的情况下可以正常工作,不依赖外部环境。
可以通过向 scope 的 { }
中传入特殊的前缀标识符(即prefix)来进行数据的绑定。
在创建了隔离的作用域,我们可以通过 @, &, =
引用应用指令的元素的属性。
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 27 28 29 30 31 32 33 34 35 <body ng-controller ="ctrl" > <input type ="text" ng-model ="name" /> <hello out-cons ="{{name}}" > </hello > <hello out-cons ="{{name}}" out-funs ="sum()" > </hello > </body > <script > var myApp = angular.module('app' , []); myApp.controller('ctrl' , ["$scope" , function ($scope) { $scope.name = "张三" ; $scope.sum = function () { } }]); myApp.directive('hello' , [function () { return { "restrict" : "E" , "templateUrl" : "view/home.html" , "scope" : { "innerCons" : "@outCons" , "innerFuns" : "=outFuns" , } }; }]); </script > <div > <input type ="text" ng-model ="innerCons" /> <span ng-click ="innerFuns()" > </div >
link link 参数要求声明一个链接函数。在此函数中,可操作 template 中的元素,设置样式、添加回调事件等
1 2 function (scope, element, attrs ) {}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - scope: 与指令元素相关联的当前作用域 - element: 当前指令对应的元素,使用它可以操作该元素及其子元素。例如`<span my-directive></span>`,这个 span 就是指令 `my-directive` 所使用的的元素 - attrs: 由当前的元素的属性组成的对象 ```js myApp.directive('hello', [function () { return { "restrict": "EA", "template": "<span>点击</span>", "link": function(scope, element, attr) { console.log(element); element.find("span").addClass("btn btn-success"); element.find("span").on("click", function(){ alert(111); }); } }; }]);
require 可以将其他指令穿给自己
data:响应体,就是后台响应后返回的数据。格式为字符串或对象
status:http返回的状态码,如200,表示服务器响应成功
headers(函数):头信息的getter函数,可以接受一个参数,用来获取对应名字的值
config(对象):生成原始请求的完整设置对象
statusText:相应的http状态文本,如”ok”