Angularjs的那些事 – 视图的生命周期
Angularjs的最主要的一个应用场景就是单页面应用(SinglePageApplication),但是SPA中会有一个明显的问题,在视图切换的时候,它只会用新视图去替换视图容器内的HTML,但如果旧视图在加载之后动态生成一些DOM元素,而这些新生成的DOM元素并没有在容器内的话,那么视图切换后,这些DOM元素还会存在。因为angular的视图切换是由js来动态完成的,并没有让浏览器去重新加载整个页面。
下面就是一个例子:
总共有两个页面,使用ngRoute来路由。视图容器如下:
![]()
其中一个页面是使用xheditor来创建的编辑器,它的工具栏能浮动出一些小框,其实就是动态在body末尾生成一些DOM元素,如下图:
![]()
最下面红色框就是新生成的元素,如果我们现在切换回首页视图会怎么样?
![]()
这些元素还在的,因此我们需要在离开这个视图的时候清除掉这些DOM元素,那么视图加载到离开都有些什么事件呢?
从官方文档看,ngView只有一个事件$viewContentLoaded,名字是在视图加载完后执行的内容。因此我们来测试如下的代码:
在视图层添加如下代码:
![]()
在控制器中添加如下的代码:
![]()
看下运行的效果:
![]()
视图层中的代码率先被执行,然后进入到控制器的逻辑,最后触发$viewContentLoaded。
从上面的代码看,如果我们加载后的事件只需要对DOM进行操作,那么在视图层的script中即可,但是如果需要使用到控制器中的数据的话,就必须在控制器中完成。
进入视图的事件搞定了,那么离开的事件呢?官方文档没有介绍,但是其他文档中我们发现$location和$route有change相关的事件。
代码如下,为了更早的生效,这段代码可以写入到app.js中:
![]()
运行结果如下:
![]()
我们完全可以在$locationChangeSuccess中判断fromUrl是不是当前视图的hash,如果是然后执行离开视图的操作即可。
同理的事件还有$routeChangeStart和$routeChangeSuccess,其实官方文档中可以看到$route是依赖于$location的,因此我们可以猜测其实他们应该是同一个东西,不同的封装而已罢了。
看如下的代码:
![]()
运行结果:
![]()
运行结果中需要注意:$routeChangeSuccess事件是在整个新的视图加载完成之后才会执行的。
因此要选择当前视图离开事件的时候,请考虑$locationChangeStart,$locationChangeSuccess,$routeChangeStart。
TIPS:这样的离开事件可以在进入视图的时候增加监听,在离开时执行完相应的操作后,取消监听,如下:
![]()
搞定了,哈哈。学习交流为主。
最后是本文中使用到的代码:点击下载 angular1.rar
Angularjs的那些事 – 视图的生命周期的更多相关文章
- iOS10 UI教程视图的生命周期
iOS10 UI教程视图的生命周期 说到视图的生命周期一般都是指视图控制器的视图生命周期.在视图的声明周期中最主要的有8个方法,分别为loadView().viewDidLoad().viewWill ...
- ios开发----视图的生命周期
熟悉web开发的朋友可能对页面page的生命周期有一定的了解和认识,正如web开发中的页面生命周期一样,移动客户端开发也有它自己的生命周期.下文将说明ios开发中视图的生命周期既运行顺序. 在ios视 ...
- 玩转iOS开发 - 视图控制器生命周期
视图控制器生命周期
- (5/18)重学Standford_iOS7开发_视图控制器生命周期_课程笔记
第五课: 1.UITextView @property (nonatomic, readonly) NSTextStorage *textStorage;//注意为只读属性,因此不能直接更改内容,NS ...
- [iOS]应用与视图的生命周期和方法调用
1.应用程序的生命周期: AppDelegate类在应用生命周期的不同阶 会回调不同的方法. 视图push到了子界面,然后子界面pop回原界面的时候,会启用viewWillAppear以及之后的几个生 ...
- 视图控制器生命周期中各个重要的方法(Swift) (Important Methods during the Lifecycle of a View Controller)
1. init(coder:) 它是视图控制器从故事板创建实例的默认初始化函数.(It is the initializer for UIViewController instances create ...
- OC开发_Storyboard——视图控制生命周期以及NSNotifications
一.生命周期 1.ViewDidLoad: 一般的初始化,除了几何图形的初始化(这个时候还没确定) 2.ViewWillAppear: 代表你的视图将要在屏幕上显示,可能会调用多次,对不可见时可能能改 ...
- iOS 视图控制器生命周期
1.init: 2.viewDidLoad: 3.viewWillAppear: 4.viewDidAppear: 5.viewWillDisappear; 6.viewDidDisappear
- UI—视图的生命周期
随机推荐
- H5即时通讯Websocket
/** * Created by admin on 2017/8/19. */ // import Vue from 'vue' // import axios from './HTTP.js' // ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
指针悬挂: 问题:使用new申请的内存内存空间无法访问,也无法释放. 原因:直接对指向new申请的存储空间的指针变量进行赋值修改 后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还 ...
- String、StringBuffer、StringBulider
三者都实现了CharSequence接口,因此CharSequence可认为是一个字符串的协议接口 1.String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改 ...
- 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...
- 47. 全排列 II
47. 全排列 II 题意 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]] 解题思路 去重的全排列 ...
- oracle中查找和删除重复记录的几种方法总结
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例): 表CZ的结 ...
- 9、SQL逻辑查询语句执行顺序
本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...
- 用delphi制作无界面的activex控件
首先,您要了解: •COM的基本原理 •能被网页调用的非可视ActiveX控件必须是一种至少实现了IOleObject接口的TAutoObject组件 •利用Delphi向导生成的ActiveX控件必 ...