既然谈周期,那必定有开始,有过程,有结束。
1.创建
创建的过程被分为两个阶段,第一个阶段是compile,第二个阶段是link。compile的时候,angular会把指令对应的模块进行转换,并且对于一个指令的多个实例,angular只会编译一次,很显然这个时候生成作用域是不合适的。这里有一个很重要的顺序,compile是从上至下执行,二link是从下至上执行的,这样的顺序保证了在进行M和V的连接时,所有的编译工作都已完成。
2.注册监听
作用域一旦生成,指令就会在它身上注册一个监视,监视数据有没有变化,就是我们平时用到的$scope.$watch()。
3.模型突变
以上两个过程完成之后,数据和视图之间的连接成功,这时候一旦数据模型发生点什么,就应该做点什么了,比如用户在文本框输入了数据,或者ajax取回的新的数据要在应用程序中,或者用户点击了一些东西需要我们更改数据。这里关键的东西是,假如数据在用户端发生了改变,如何从js的环境中进入到angular的环境中操作在angular模型上的数据。apply()是angular的内置方法,当你自定义指令的时候,更新数据时你唯一的选择就是他。
4.观察
有了变化我们就要观察这个变化影响的范围有多大,那么在进入angular环境之后就会进行脏值检查。既然作用域是原型继承下来的,而且和DOM结构平行,那么显然最先应该检查rootscope,然后传播到所有的子作用域,这时候$watch设置的一些函数、表达式就会被执行,相应的改变发生的话就应用你设置好的函数等。
5.摧毁
当我们不再需要一个作用域,需要将它移除掉,原则就是谁创建谁摧毁,使用的方法就是$destory(),这里如同apply,这个方法一要被调用,至于谁调用,参照原则。如果不做,在进行digest函数时,他仍会被加入其中,增加性能的开销。执行完这个方法后,他占用的内从才能被释放,进而被当成垃圾回收掉。
以上就是scope整个生命周期,记住几个关键词:link,regesit,mutation,apply,digest,destory