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

 

最新文章

  1. Reporting Service 没有权限登陆
  2. NeHe OpenGL教程 第四十五课:顶点缓存
  3. first集合及follow集合
  4. Eclipse修改编码后乱码解决
  5. HDOJ 1163 Eddy's digital Roots(九余数定理的应用)
  6. ajax请求webservice时抛出终止线程的异常
  7. 学习linux之vi编辑器
  8. crontab定时任务不执行的原因
  9. BAYESIAN STATISTICS AND CLINICAL TRIAL CONCLUSIONS: WHY THE OPTIMSE STUDY SHOULD BE CONSIDERED POSITIVE(转)
  10. Ubuntu 简单安装和配置 GitLab
  11. Java动态代理模式浅析
  12. 关于Flask-Login中session失效时间的处理
  13. 操作系统底层原理与Python中socket解读
  14. 解决Android Studio编译后安装apk报错:Error while Installing APK
  15. http请求流程
  16. Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS
  17. iOS 提交应用过程出现的错误及#解决方案#images can't contain alpha channels or transparencies
  18. 咏南中间件开始支持redis client接口调用
  19. 【Android】Android import和export使用说明 及 export报错:jarlist.cache: Resource is out of sync with the file syst解决
  20. 通过html5 的EventSource来进行数据推送

热门文章

  1. 用Python破解斗地主残局
  2. Codeforces.833B.The Bakery(线段树 DP)
  3. float类型数保留一位小数
  4. Reactor 3 学习笔记(2)
  5. 解决springboot druid 数据库批量更新错误问题
  6. Web App 和 Native App,哪个是趋势?
  7. 线程安全的CopyOnWriteArrayList介绍
  8. 微信小程序无法获取UnionId的情况及处理
  9. 理解TIME_WAIT
  10. GitHub下载安装以及开源项目