AngularJS 如何在控制台进行错误调试


Posted in Javascript onJune 07, 2016

当我们在编写 AngularJS 的应用时,通过 Chrome, Firefox, 和 IE 的 JavaScript 控制台来获取隐藏在应用之中的数据(Data)和服务(Service) 是一件非常具有挑战性的工作。下面列出了一些简单的小窍门,可以帮助我们使用 Javascript 控制台来监视和控制一个正在运行的 Angular 应用,使其更加容易测试、修改甚至是实时的编写 Angular 应用。

1: 获取 Scopes (作用域)

我们可以使用一行 JS 代码来获取任何的 Scope (甚至是 isolated scopes) :

> angular.element(targetNode).scope()

-> ChildScope {$id: "005", this: ChildScope, $$listeners: Object, $$listenerCount: Object, $parent: Scope…}

或者获取 isolated scopes:

> angular.element(targetNode).isolateScope()

-> Scope {$id: "009", $$childTail: ChildScope, $$childHead: ChildScope, $$prevSibling: ChildScope, $$nextSibling: Scope…}

这里面的 targetNode 指的是 HTML Node(HTML节点)。你可以很容易的使用 document.querySelector() 来获取。

2: 监视 Scope Tree (作用域树)

为了更好的调试我们的应用,有些时候我们需要查看页面上的 Scope (作用域) 的结构师怎样的。这时候我们就需要使用 AngularJS
 Baratang 和 ng-inspector 这两个 Chrome 浏览器扩展来帮助我们实时查看 Scope (作用域) 的情况。并且,这两个扩展还有一些其他非常有用的功能。

    (1).AngularJS Baratang

AngularJS 如何在控制台进行错误调试

    (2).ng-inspector

AngularJS 如何在控制台进行错误调试

3: 抓取 Services (服务)

我们可以使用定义了 ngApp 元素的 injector 函数来抓取任何 Service (服务) 或者间接的通过任何带有 ng-scope class 的元素来获取 Service (服务)。

> angular.element(document.querySelector('html')).injector().get('MyService')

-> Object {undo: function, redo: function, _pushAction: function, newDocument: function, init: function…}

// Or slightly more generic

> angular.element(document.querySelector('.ng-scope')).injector().get('MyService')

接下来我们就可以使用相关的 Service 就像我们在程序中 injected(注入)过之后那样使用。

4: 从 directive 中获取 controller

有一些 directives (指令) 会将一些特定(通常是可以共用的)功能定义成为一个控制器。为了从控制台中获取一个指定 directive (指令) 的 controller (控制器) 示例, 我们只需要使用 controller() 函数。

> angular.element('my-pages').controller()

-> Constructor {}

最后一个不常用但是属于更高级的技巧。

5: Chrome Console(控制台) 特性

Chrome 有很多在 console (控制台) 中用于调试网页应用的非常好用的快捷命令。下面是对 Angular 开发最有帮助的一些命令:

    $0 - $4: 在 instpector window (监控器) 中获取最后的 5 个 DOM 元素。这个快捷方法可以非常方便的帮助我们来抓取选定元素的 scopes (作用域) : angular.element($0).scope()

    $(selector) 和 $$(selector): 可以方便的替代 querySelector() 和 querySelectorAll。

感谢 @zgohr 提供的这个小窍门!

总结

通过这些简单的小窍门,我们可以获取任意 scope (作用域) 中的数据、监控scope (作用域) 的层级、注入 services (服务) 并且 控制 directives (指令)。

所以下次,当你想要做一些微调、检查代码或者从控制台来控制一个 AngularJS 应用,我希望你能够像我一样记起这些小窍门并多加使用。

查看更多AngularJS的语法,大家可以关注:AngularJS 参考手册英文版,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
转一个日期输入控件,支持FF
Apr 27 Javascript
国外Lightbox v2.03.3 最新版 下载
Oct 17 Javascript
asp批量修改记录的代码
Jun 25 Javascript
js实现兼容IE6与IE7的DIV高度
May 13 Javascript
Javascript 面向对象(二)封装代码
May 23 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
JS实现两周内自动登录功能
Mar 23 Javascript
详解使用React全家桶搭建一个后台管理系统
Nov 04 Javascript
SVG实现时钟效果
Jul 17 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
Jan 21 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
详解JS预解析原理
Jun 16 Javascript
JQuery异步加载PartialView的方法
Jun 07 #Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 #Javascript
Bootstrap学习笔记之css样式设计(1)
Jun 07 #Javascript
jQuery hover事件简单实现同时绑定2个方法
Jun 07 #Javascript
PassWord输入框代码分享
Jun 07 #Javascript
Bootstrap学习笔记之css组件(3)
Jun 07 #Javascript
JavaScript判断数组重复内容的两种方法(推荐)
Jun 06 #Javascript
You might like
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
详解django中自定义标签和过滤器
2017/07/03 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
使用Python读取大文件的方法
2018/02/11 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
逻辑链路控制协议
2016/10/01 面试题
总经理岗位职责
2013/11/09 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
客房服务员岗位职责
2015/02/09 职场文书