angular 表达式 通过$parse服务解析执行。
与Javascript表达式的区别
1.属性求值:所有属性的求值是对于scope的,而javascript是对于window对象的;
2.宽容:表达式求值,对于underfined和null,angular是宽容的,单javascript会产生NullPointerExceptions=
3.没有流程控制语句:在angular表达式里,不能做以下任何的事:条件分支、循环、抛出异常。
4.过滤器(filters):我们可以就将表达式的结果传入过滤链(filter chains);
<body ng-app>
<!--
model==>1213
view ==>1213
3个view
数据是双向的
-->
<input type="test" ng-model="name"/>
<!--angular 的表达式-->
{{name}}
<input type="test" ng-model="name"/>
<!--<script type="text/javascript">
var string='alert(1+2)';
eval(string);
</script>-->
</body>
scope是指向应用model的object,也是表达式的执行上下文。
scope被放置于一个类似应用的DOM结构的层次结构中。
变量变量:
1.能通过固定的接口才能改变变量的值,比如说只能通过set()设置变量的值,set被调用时比较一下就知道了。比较繁琐。
2.脏检查。
angular 使用的就是脏检查:
1.不会脏检查所有的对象,当对象被绑定到html中,这个对象添加为检查对象(watcher).
2.不会脏检查所有的属性,同样当属性被绑定后,这个属性会被列为检查的属性。
当angular程序初始化时,会将绑定的对象的属性添加为监听对象(watcher),也就是说一个对象绑定了N个属性,就会添加N个watcher。
什么时候去脏检查?
angular所系统的方法中都会触发比较事件,比如:controller初始化的时候,所有以ng-开头的事件执行后,都会触发脏检查。
手动触发脏检查:
$apply仅仅只是进入angular context,然后通过$digest去触发脏检查
$apply如果不给差数的话,检查该$scope里的所有监听的属性,推荐给上参数
$digest()
所属的scope和其所有子scope的脏检查,脏检查又会触发$watch().整个Angular双向绑定机制就活了起来
不建议直接调用$digest(),而应该使用$apply(),$apply 其实不能把信直接送给$apply,之间还有$eval门卫把关,如果$apply带的表达式不合法
$eval会把错误送交$exceptionHandler,合法才触发digest,所以更安全。
怎么触发脏检查?
首先通过$apply方法,去触发eval()方法,当eval()解析器解析成功的时候,会触发digest()方法,digest()方法就会触发watch()方法,
$watch():
在digest执行时,如果watch观察的value与上次执行时不一样时,就会被触发
Angularjs 内部的watch实现了页面随model的及时更新
$watch(watchFn,watchAction,deepWatch)
watchFn:angular表达式或函数的字符创
watchAction(newValue,oldValue,scope):watchFn发生变化会被调用
deepWatch:可选择的布尔值命令检查被监控的对象的每个属性是否发生变化
$watch会返回一个函数,想要注销这个watch可以使用函数。