AngularJS入门

AngularJS概述
一个纯JS框架
适用于以数据操作为主的SPA(Single Page Application)应用

四大特性

  • 采用MVC模式:页面中无dom操作 ---- MVVM
  • 双向数据绑定
  • 依赖注入
  • 模块化设计

Angular中ng模块提供的指令(Directive)

  • ngApp:自动载入/启动一个Angular应用
    语法:<ANY ng-app=”XXX”></ANY>
               <ANY data-ng-app=”xxx”></ANY>
    每个HTML只有一个ng-app指令,用于确定AngularJS应用范围
  • ngInit:用于声明Model变量 × [不推荐使用]
    此变量前,不能存在var声明
    语法:<ANY ng-init=”key=value;key=value;...”></ANY>
               <ANY class=”ng-init:key=value;”></ANY>
    可以先使用再声明
    一次可声明多个变量,使用;隔开
  • ngController:创建一个控制器对象的实例(即调用Controller函数) √
    *语法:<ANY ng-controller=”控制器名称”></ANY>
  • ngBind:在当前元素的innerHTML上输出指定表达式的值 √
    语法:<ANY ng-bind=”表达式”></ANY> 与{{表达式效果一致}}
  • ngRepeat:为HTML增加循环功能,循环输出当前元素
    语法:<ANY ng-repeat=”变量名 in Model数组/对象”>{{变量名}}</ANY>
               <ANY ng-repeat=”(k,v) in Model数组/对象”>{{k}}--{{v}}</ANY>
  • ngIf::为HTML增加选择功能,只有在表达式值为true时,当前元素才添加
    语法:<ANY ng-if=”表达式”></ANY>
    注意:条件为假的时候,从DOM树删除
  • ngSrc:当src中出现的Model变量,从而解决在加载前出现404错误
    语法:<img ng-src=”images/{{}}”></img>等
  • ngClick:为元素绑定监听函数[模型函数] {所有类似事件语法}
    语法:<ANY ng-click=”模型函数()”></ANY>
    使用$scope.函数 = function(){}声明模型函数
  • ngStyle:为当前元素制定样式,赋值为Model对象
    语法:<ANY ng-style=”模型对象”></ANY>
  • ngShow/ngHide:通过display属性控制是否显示
    语法:<ANY ng-show/ng-hide=”表达式”></ANY>
    注意:show为真show假hide hide为真hide假show
  • ngDisabled:控制当前元素是否禁用
    语法:<ANY ng-disabled=”表达式”></ANY>
    注意:值为真时禁用,假为使用
  • ngChecked:

Angular中ng模块提供的函数(Function)
angular.module()
angular.forEach(obj,function(key,value){})

Angular中ng模块提供的服务(Service)

  1. $rootScope $location 修改/读取当前URL $log.error/info...日志输出服务
  2. $interval 周期定时
  • 返回值为promise对象
  • 解除定时器 $interval.cancel(e);
  • e为promise对象
  1. $timeout 一次定时
  2. $http 发起异步的AJAX请求服务
  3. $http.post/get(‘路径’).success(function(data){}) post需要更改请求头

Angular表达式
{{表达式}} 作用:当前位置输出该表达式的值
不能出现new关键字
算术运算中不含++/--
赋值运算中不含+=/-=
特殊运算禁用
可以调用对象的方法和属性

Angular声明变量---Model数据

  • 使用ngInit指令声明 [View,Model混合] ×
  • 使用Controller创建变量 √
    新版本Angular 不允许使用全局函数污染全局
    新版本Angular要求控制器必须声明在一个模块中
    创建Module <= 创建Controller <= 创建Model变量
    具体步骤
  1. 声明一个自定义模块module
    angular.module(‘模块名’,[])
  2. 在当前AngularJS应用中注册自定义模块
    ng-app=”模块名”
  3. 在自定义模块中创建Controller函数
  4. 声明Model数据
    $scope.key = value;
  5. 在View中创建Controller对象实例,指定其作用范围
    <ANY ng-controller=”控制器名称”></ANY>
    在ANY标签范围内输出声明过的Model变量
  6. 在Controller作用范围内输出Model变量
    angular表达式作为输出
<script>
//1.声明module
angular.module('myModule1',['ng']).controller('myController1',function ($scope) {
  //3.创建Controller函数
  //4.使用Controller函数创建修改删除Model数据
  $scope.ename = 'Tom';
  $scope.age = 30;
  $scope.add = "陕西";
  $scope.birthday = new Date();
})
</script>
<div ng-controller="myController1">
  <p>ename:{{ename}}</p>
  <p>age:{{age}}</p>
  <p>birthday:{{birthday}}</p>
</div>

$scope创建局部模型变量
$rootScope 创建全局模型变量 [可实现继承]

Angular双向数据绑定

  • 方向一:把Model数据绑定到View中,当数据发生改变时,view随之改变
    实现:*ng-bind *{{}} *ng-repeat *ng-if *ng-src等众多指令均实现
    优点:无需DOM操作,直接操作模型数据即可
  • 方向二:把View中的修改绑定到Model上,当view发生改变,数据随之改变
    实现:ng-model指令 针对[input/textarea/select等]
    优点:表单控件value的值改变,模型数据直接改变并且该指令会在初始时实现方向一,先查询模型数据
    说明:单行文本输入域,多行文本输入域,下拉框,单选按钮默认将value绑定,而复选框会把true/false值绑定

Angular依赖注入 ----- 其他的依赖注入方式众多

体现“最少知识”设计原则
需要外部js时,若使用.min.js文件,会将形参混淆
解决:在控制器中声明数组(‘name’,[‘$http’,’$scope’,function(a,b){}]);

  • 依赖Dependency :方法依赖参数
    依赖对象的解决:
  1. 主动创建,并传递
  2. 被动注入Inject ----- 成为依赖注入
    由特定框架创建方法,发现依赖对象,则自动创建被依赖对象

举例
module.controller(“name”,function($scope,$xxx,$yyy){});
控制器对象不能自己手动创建,即框架创建ng-controller
传递依赖的参数对象必须为框架提供的参数名称如$scope

Angular中ng模块提供的过滤器(Filter)
对模型数据在view中呈现时进行某种格式的筛选/过滤
过滤器使用时,需要借助管道 |
语法:{{数据 | 过滤1 | 过滤2 | ....}}
lowercase *uppercase *number:小数位数 *currency:’符号’
date:’格式’ 将长整形数字转换成指定格式时间

Angular模块化设计
体现“高内聚低耦合”设计原则
项目中,根据不同功能,将不同组件放置在不同模块中
AngularJS两种模块

  • 官方提供模块
  • 用户自定义模块

Angular中ngRoute模块 ---- 实现spa的关键
Route:路由,为到达目的地而经过的线路
可以让用户自定义”路由字典”,自动解析请求的路由地址,查找路由字典,自动发起异步请求,将获取的结果放到当前页面

使用:只需要自定义路由字典即可
引入angular.js和angular-route.js
<div ng-view></div> ng-view标志包含获取结果,有且只包含一个页面
创建自定义模块,声明依赖于ng和ngRoute模块
在当前模块中使用ngRoute提供的对象配置路由字典
创建不同的模板页面
测试路由字典的配置是否正确

angular.module('M',['ng','ngRoute']).controller(‘xxx’
,function($scope){
    $scope.xxx = xxx ;
}).config(function ($routeProvider) {//配置路由字典
  $routeProvider.when('/start',{
      templateUrl:'tpl/start.html',
   controller:'xxx'
  }).otherwise({ //若未提供或错误的路由地址则访问此
   redirectTo:'/start'
})

注意事项:

  1. 由于模板页面被客户端请求后挂载到当前DOM树上,即相对当前页面路径
  2. 使用ngRoute模块时,无需为模板页面中某个元素单独设置controller,只需
    要在声明路由字典时设置controller即可,同时在其前声明数据变量等。见上
  3. 跳转路由地址的方式:
    <a href = “#/start”></a> href 中为路由字典中设置的路径声明
    <button ng-click=”jump()”></button>
    $scope.jump = function(){
    $location.path(‘/start’); //修改url路由地址部分
    }
    a标签中必须包含#,而path的参数不需要#

Angular中ngAnimate模块
可以支持JS,Transition,Keyframes动画,本身未提供动画效果,而是为上述三种技术提供了相应的”动画钩子(Hooks)”
ng模块中的指令默认都提供了动画钩子

  • 使用ngView [enter and leave]
    1.使用ngAnimate模块调用css Transition动画钩子步骤
  • 引入angular.js 和 angular-animate.js 以及angular-route.js
  • 自定义模块中声明依赖于ngAnimate模块即可产生动画钩子
  • 为ng-view设定class=”page” 对应即可
  • 自定义样式
    .page{transition: all .15s linear;position: absolute;width: 100%;}
    .page.ng-leave{left:0;} [要离开时]
    .page.ng-leave.ng-leave-active{left: -100%;} [离开后]
    .page.ng-enter{left: 100%;} [要进入时]
    .page.ng-enter.ng-enter-active{left:0;} [进入后]
  • 注意:overflow:hidden;
    2.使用ngAnimate模块调用其它动画

补充引入页面:

  • 使用Web服务器的SSI技术(SeverSideInclude) --- 修改Web服务器配置文件[复杂]
  • 使用服务器段动态编程语言进行页面包含,如php:include (‘footer.html’);等[优先使用]
  • 前端

1.使用framset/iframe ---- 少用 会使布局难以控制
2.使用AJAX异步请求 ---- 请求次数多
$(document).ready(function(){
$(‘#header’).load(‘header.html’)
*})
3.AngularJS中提供类似AJAX方式 √
ngInclude <div ng-include=” ’header.html’ ”></div>
指令必须赋值为一个字符串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容