Angularjs 学习笔记

Posted weiqinshian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angularjs 学习笔记相关的知识,希望对你有一定的参考价值。

 

Angular    

简介

 

js 是基础,angularJs 是 js 框架

 

起源

  • 2009Google Feedback Project
  • 6个月开发的17000行前端代码,使用3周压缩到1500

 

简介

  • Angularjs 致力于减轻开发人员在开发AJAX应用过程中的痛苦
  • 官网:http://www.angularjs.org/

 

ajax 开发是单页应用

概念

  • 客户端模版
  • MVC
  • 数据绑定
  • 依赖注入

 

客户端模版

  • Angular中,模版和数据都会被发送到浏览器中,然后在客户端进行装配

【以前模板和数据是在后端装配完的,如servlet】

 

MVC

  • MVC核心概念:把管理数据的代码(model)、应用逻辑代码(controller)、向用户展示数据的代码(view)清晰地分离开
  • Angularjs应用中:
    视图就是Document Object Model
    控制器就是javascript
    模型数据则被存储在对象的属性中

 

数据绑定

  • 数据绑定可自动将modelview间的数据同步。
  • Angular实现数据绑定的方式,可以让我们把model当作程序中唯一可信的数据来源。view始终是model的投影。当model发生变化时,会自动反映到view上。

 

经典模板系统中的数据绑定

 

  • 大多数模板系统中的数据绑定都是单向的
  • 把模板与model合并在一起变成view,如果在合并之后,model发生了变化,不会自动反映到view上。
  • 用户在view上的交互也不会反映到model中,开发者必须写大量代码不断地在viewmodel之间同步数据。

 

Anguarjs 模板中的数据绑定

 

  • 模板是在浏览器中编译的,在编译阶段产生了一个实时更新(live)的视图
  • 不论在model或是view上发生了变化,都会立刻反映到对方。
  • model成为程序中唯一真实的数据来源,极大地简化了开发者需要处理的编程模型。

依赖注入

依赖注入是一种软件设计模式,用来处理代码的依赖关系。【如java spring Ioc】

 

  • Angular的依赖注入只是简单的获取它所需要的东西,而不需要创建那些他们所依赖的东西

Demo 001-依赖注入

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Angularjs-视频教程-001-简介</title>
  5. </head>
  6. <body>
  7. <script>
  8. var A = function () {
  9. this.getName = function () {
  10. return \'张三\';
  11. }
  12. }
  13. var a = new A;
  14. var B = function () {
  15. // B 依赖于 a,b对象中需要用到a对象
  16. document.write(a.getName());
  17. }
  18. // a 注入 b,将a传入b对象中
  19. var b = new B();
  20. //在用b对象时需要用到a对象 ,js里2个方法实现:
  21. // 1. 将a 传入到b里面去
  22. // 2. a是全局变量
  23. </script>
  24. </body>
  25. </html>

指令

ng-app

  • ng-app指令告诉Angular应该管理页面中的哪一块

 

【写在body里面,管理整个body里面的元素,管理整个页面】

 

模版显示文本 && ng-bind

  • {{expression}}【写在双大括号里面的是表达式】
  • <tag ng-bind="expression"></tag>

 

 

Demo 002--数据双向绑定:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body ng-app>

<!--

view => 12131

model => 12131

3 view

数据是双向绑定的

-->

<input type="text" ng-model="name" value=""/>

<!--angular的表达式-->

{{ name }}

<input type="text" ng-model="name" value=""/>

<script type="text/javascript" src="../vendor/angular/angularjs.js"></script>

</body>

</html>

 

 

javascript 表达式

创建一个字符串,使用函数eval解析

  • var str = \'alert(1+2)\';
  • eval(str)

 

 

angular 表达式

  • angular 表达式 通过$parse服务解析执行。
  • Javascript 表达式的区别:
    1.
    属性求值:所有属性的求值是对于scope的,而javascript是对于window对象的。

【var a=3,是针对window的属性】

2.宽容:表达式求值,对于undefinednullangular是宽容的,但Javascript会产生NullPointerExceptions

3.没有流程控制语句:在angular表达式里,不能做以下任何的事:条件分支、循环、抛出异常

4.过滤器(filters):我们可以就将表达式的结果传入过滤器链(filter chains

 

 

ng-controller

  • 控制器就是你所编写的类或者类型,它的作用是告诉Angular该模型是由哪些对象或者基本数据结构构成的

 

Demo 003--控制器

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<div ng-app="">

<div ng-controller="firstController">

<input type="text" value="" ng-model="name"/>

<input type="text" value="" ng-model="age"/>

{{name}}

{{age}}

</div>

</div>

<script type="text/javascript" src="app/index.js"></script>

<script type="text/javascript" src="../../vendor/angular/angularjs.js"></script>

</body>

</html>

 

 

var firstController = function($scope){

//$scope 我们叫做作用域,是管理firstController控制器范围所有的数据的作用域,和js函数的作用域一样

// 申明一个默认的Model

$scope.name = \'张三\';

$scope.age = 20;

}

 

 

 

Demo 005-多个控制器 作用域链的问题

AngularJs 多个controller作用域和 js 函数变量左右域的原理类似, 函数里面使用变量的时候,优先找函数作用域里面的是否有该变量,如果没有,就去访问函数外面的变量.

 

下面的demo中,总共有三个作用域,一个是ng-app, 另外两个分别是firstController、secondController

 

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<div ng-app="">

<div ng-controller="firstController">

<input type="text" value="" ng-model="name"/>

<div ng-controller="secondController">

<input type="text" value="" ng-model="name"/>

</div>

</div>

</div>

<script>

function first(){

var name = \'张三\';

function second(){

var name = \'张三12121212121\';

alert(name);

}

}

</script>

<script type="text/javascript" src="app/index.js"></script>

<script type="text/javascript" src="../../vendor/angular/angularjs.js"></script>

</body>

</html>

 

Index.js

 

var firstController = function($scope){

$scope.name = \'张三\';

console.log($scope);

}

var secondController = function($scope){

console.log($scope);

}

 

 

ng-bind

ng-bind 也可以展现$scope里面的数据,比{{}} 展示数据的优势在于,使用ng-bind,当angularJs 没有加载完的时候,不会显示任何东西,而使用{{}},会显示乱码

 

$scope

 

什么是 scope

  • scope是一个指向应用modelobject,也是表达式的执行上下文。
  • scope被放置于一个类似应用的DOM结构的层次结构中。
  • scope 类似js 的作用域链

 

 

scope的特性

  • scope提供$watch API,用于监测model的变化。
  • scope提供$apply,在"Angular realm"controllerserverangular event handler)之外,从系统到视图传播任何model的变化。
  • scope可以在提供到被共享的model属性的访问的时候,被嵌入到独立的应用组件中。scope通过(原型),从parent scope中继承属性。

 

 

$apply

【$apply方法有什么用?当apply 方法执行完之后,会触发angular里面的脏检查,检查每一个scope里面的属性是否有变化,如果有变化,所对应的其他的model 、value 都会变化】

  • $scope.$apply(expression)
  • $apply()方法可以在angular框架之外执行angular JS的表达式,例如:DOM事件、setTimeoutXHR或其他第三方的库

 

 

angular是怎么知道变量发生了改变

  • 要知道一个变量变了,方法不外乎两种
  • 1.能通过固定的接口才能改变变量的值,比如说只能通过 set() 设置变量的值,set被调用时比较一下就知道了。这中方法的缺点洗是写法繁琐
  • 2.脏检查,将原对象复制一份快照,在某个时间,比较现在对象与快照的值,如果不一样就表明发生变化,这个策略要保留两份变量,而且要遍历对象,比较每个属性,这样会有一定性能问题

 

 

angular的策略

  • angular的实现是使用脏检查
  • angular的策略
    1.
    不会脏检查所有的对象,当对象被绑定到html中,这个对象添加为检查对象(watcher)。
    2.
    不会脏检查所有的属性,同样当属性被绑定后,这个属性会被列为检查的属性。
  • angular程序初始化时,会将绑定的对象的属性添加为监听对象(watcher),也就是说一个对象绑定了N个属性,就会添加Nwatcher

 

 

什么时候去脏检查

  • angular 所系统的方法中都会触发比较事件,比如:controller 初始化的时候,所有以ng-开头的事件执行后,都会触发脏检查

 

 

手动触发脏检查

  • $apply仅仅只是进入angular context ,然后通过$digest去触发脏检查
  • $apply如果不给参数的话,会检查该$scope里的所有监听的属性,推荐给上参数

 

【只有需要手动触发的时候脏检查,才需要调用apply方法。否则,比如,:controller 初始化的时候,系统会自动在后台调用apply方法。】

 

Demo 006-$scope里$apply、$digest方法

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<div ng-app="">

<div ng-controller="firstController">

{{date}}

</div>

</div>

<script type="text/javascript" src="app/index.js"></script>

<script type="text/javascript" src="../../vendor/angular/angularjs.js"></script> 以上是关于Angularjs 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

[Angularjs-学习笔记]工具篇

angularjs学习笔记之一

AngularJS学习笔记01 序

AngularJS入门学习笔记一

AngularJS学习笔记

AngularJS学习笔记