angular中作用域的生命周期

黑洞算法
• 阅读 3763
先扯淡是惯例-------------生命对于人而言是再重要不过的东西了,但你不太可能每天去考虑自己离生命结束还有多久,生命周期就更谈不上了,人的生命一旦结束就不会再次开始,如果你坚持认为生命有轮回,好吧,咱俩的淡扯不到一块去。但对于angular的作用域来讲,它确实是有生命周期的,也就是说它可以死而复生,而且一定是在你需要它的时候它就生,不需要它的时候就让它死,听起来有些冷酷无情,但假如它在该死的时候没死,该活的时候没活,那结果可能就是----你被它玩死。生死这词大残酷了,我们还是文雅点,就叫它生命周期吧,开始正题。

一、## 弄清楚一个问题前我们必须知道它是个什么东西 ##

  1. 先仰视-----毕竟对于前端来讲,首次听到MVC时觉得好牛X,它是啥玩意不多说,但如果你认为$scope就是我们的数据模型的话,建议你好好的温习下google大大对它的定义,必竟这个东西不同于扯淡,我们需要一个严谨的态度。$scope只是MVC中C和V的桥梁,或者官方的说法叫做glue,我觉得这个单词很传神的表达了对$scope的定位。也就是说它的存在会把MVC给贯穿起来,它是否处于生命周期之中,直接影响了MVC之间是否能够彼此互通。那么M呢,它在哪里?别这些文字弄晕,M大多数也存在于$scope上,但又不仅在这里,也可能你把它直接扔在了HTML里,或者存在于某个DOM元素的属性上。

  2. 之所以仰视,是因为我们跪着,站起来吧-------很高大上么,no,no,no,说的直白点,$scope就是一个对象,和我们在js代码里看到的{}没什么不同,不要因为它和MVC厮混在一起就觉得它有多高大上,也不要觉得它名字叫作用域就觉得它好牛叉,它和js中的作用域完全是两个概念。既然是对象,那它也原型,有也在自己的原型链中所处的位置,事实就是这么一回事。

二、## 主题——生命周期 ##
既然谈周期,那必定有开始,有过程,有结束。

  1. 创建——在angularJS 1版本中,指令才是大boss,可以说就是它在指点的江山,所在angular应该在启动以后,第一步必须是先找到这些boss,boss能力有大小,有的可以创建scope,有的则不行,比如最常见到的ng-controller和ng-repeate都会创建自己的作用域,有些指令还会创建属于自己的隔离作用域,应用了transclude属性后还会创建隔离作用域的兄弟作用域,前面这句把angular中所有的4种作用域的类型都说了,想要弄清楚自己资料,或者等我哪天兴致来了再写吧。至于创建的过程被分成了2个阶段,第一阶段是compile,第二阶段是link,那你猜scope是在哪个阶段创建?如果真的是靠猜的,还是好好查查资料。compile的时候,angular会把指令对应的模板进行转换,并且对于一个指令的多个实例,angular只会编译一次,很显然这时候生成作用域是不合适的。这里有一个很重要的顺序就是compile从上到下,而link是从下到上的,这样的顺序保证了在进行M和V的链接时,所有的编译工作都已完成。

  2. 注册监视——作用域一旦生成,指令就会在它身上注册一个监视,就是我们平时用到的$scope.$watch(),顾名思义监视什么,肯定是去监视数据有没有变化啊,难道还监视隔壁妹子洗澡不成。

  3. 模型突变——以上两个过程完成之后,数据和视图之间的链接成功建议,这个时候一旦数据模型发生了变化,就应该做点什么了,当然做什么取决于你。这个时候比如用户在文本框里输入了数据,或者ajax取回的新的数据要应用在程序中,或者用户点击了东西需要我们更改一些数据。这里关键的东西是,假如数据在用户端发生了变化,如何从浏览器的js环境进入到angular的环境中操作在angular模型上的数据,这里偷个懒用下官网的图,但是请记住$scope.$apply,它是从js进入到angular的通道,在应该内置指令时,你不会去调用这个方法是因为angular帮你做了,等于没做。那么当你自己定义指令时,要更新数据时你唯一的选择就是它。
    angular中作用域的生命周期

  4. 观察——有了变化,我们就要观察这个变化影响的范围到底有多大,那么在进入到angular环境后就会执行那个颇受诟病的脏值检查。既然作用域是原型继承下来的,而且和DOM结构平行,那显然最先应该检查就是rooScope,然后传播到所有的子作用域上,这个时候$watch,设置的一些函数,表达式等就会被执行,相应的改变发生的话就应用你设置好的函数等。

  5. 摧毁——当我们不在需要一个作用域,需要将它移除掉,原则就是谁创建谁销毁,使用的方法就是$scope.$destroy(),这里如同apply一样,这个方法一要被调用,至于谁调用,参照原则。如果不做呢?good question,不做也不会被枪毙,只是在进行digest循环时,它仍然会被加入其中,增加性能的开销。执行完这个方法后,它占用的内存才能被释放,进而被当成垃圾回收掉。

以上就是scope整个生命周期,请记住这几个关键词:link,regesit,mutation,apply,digest,destory。

点赞
收藏
评论区
推荐文章
郜小超 郜小超
4年前
史上最全前端面试题(但是没有答案 自己百度 手动狗头!)
Vue面试题生命周期函数面试题1.什么是vue生命周期2.vue生命周期的作用是什么3.第一次页面加载会触发哪几个钩子4.简述每个周期具体适合哪些场景5.created和mounted的区别6.vue获取数据在哪个周期函数7.请详细说下你对vue生命周期的理解?vue路由面试题1.mvvm框架是什么?2.vuerout
Easter79 Easter79
3年前
vue 生命周期的理解(created && mouted的区别)
生命周期先上图(笑skr个人~~)!(https://oscimg.oschina.net/oscnet/6d899c3576884ee9db73c0263ac9f4027e0.png)什么是生命周期Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我
Easter79 Easter79
3年前
Vue 的生命周期之间到底做了什么事清?(源码详解)
前言相信大家对Vue有哪些生命周期早就已经烂熟于心,但是对于这些生命周期的前后分别做了哪些事情,可能还有些不熟悉。本篇文章就从一个完整的流程开始,详细讲解各个生命周期之间发生了什么事情。注意本文不涉及keepalive的场景和错误处理的场景。初始化流程newVue从newVue(opti
Souleigh ✨ Souleigh ✨
4年前
React 灵魂 23 问,你能答对几个?
1、setState是异步还是同步?1.合成事件中是异步2.钩子函数中的是异步3.原生事件中是同步4.setTimeout中是同步相关链接:你真的理解setState吗?:2、聊聊react@16.4的生命周期相关连接:React生命周期我对Reactv16.4生命周期的
Easter79 Easter79
3年前
Spring中管理Bean依赖注入之后和Bean销毁之前的行为
    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。Bean依赖关系注入之后的行为:    Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为:在Spring配置文件
Stella981 Stella981
3年前
Flutter 中的组件绘制完成监听、组件生命周期和APP生命周期
Flutter的生命周期说到Flutter的生命周期,其实就是说StatefulWidget的生命周期,因为StatelessWidget是静态控件。StatefulWidget,通过借助于State对象,处理状态变化,并体现在UI上。这些阶段,就涵盖了一个组件从加载到卸载的全过程,即生命周期。
Stella981 Stella981
3年前
React Native 中组件的生命周期
概述就像Android开发中的View一样,ReactNative(RN)中的组件也有生命周期(Lifecycle)。所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键。RN组件的生命周期整理如下图:!33componentlifecycle(https://static.osch
Stella981 Stella981
3年前
Laravel的生命周期
Laravel的生命周期世间万物皆有生命周期,当我们使用任何工具时都需要理解它的工作原理,那么用起来就会得心应手,应用开发也是如此。理解了它的原理,那么使用起来就会游刃有余。在了解Laravel的生命周期前,我们先回顾一下PHP的生命周期。PHP的生命周期PHP的运行模
Stella981 Stella981
3年前
React生命周期
自从React发布Fiber之后,更新速度日新月异,而生命周期也随之改变,虽然原有的一些生命周期函数面临废弃,但理解其背后更新的机制也是一种学习在这里根据官方文档以及社区上其他优秀的文章进行一个对于生命周期的总结,大致上分为以下三个模块1.新老生命周期的区别2.为什么数据获取要在componentDidMount中进行3.
Wesley13 Wesley13
3年前
1.Actor编写
ESGrain生命周期Ray中ESGrain继承自Grain扩展了Grain的生命周期。Grain的生命周期参见文档附录:1Grain生命周期译注.md(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FRayTale%2FD
融云IM即时通讯 融云IM即时通讯
5个月前
融云IM干货丨uni-app 生命周期有哪些?
uniapp的生命周期分为应用生命周期、页面生命周期和组件生命周期三类:应用生命周期应用生命周期函数需要在App.vue中声明,主要包含以下函数:onLaunch:当uniapp初始化完成时触发(全局只触发一次)。onShow:当uniapp启动,或从后台