使用 AngularJS,最重要的特点之一,就是它的数据绑定了。
共性
在 AJS 中,经常需要将给定的变量或者表达式,来添加在某个 html 元素内,这个时候经常用到的就是 ng-bind 和双括号(hexo不允许使用半角的花括号,因此只能用中文或者是全角符号了)了,如:
在这个例子中,两个 p 元素都能在浏览器上显示 str 的内容。这也就是数据绑定的实现。
个性
尽管 ng-bind 和双括号的作用是一致的,但是两者仍然有一些区别。在两者之中,也更推荐使用 ng-bind。
可见性
所谓的“可见性”,就是指,在打开页面时,页面内会展现出 AJS 的变量或者表达式。
这是因为此时 HTML 内容已经加载完成,但 Angular 脚本尚未加载完成,因此还没有替换掉 HTML 中的双括号注释。
事实上这个也是我在刚开始学习开发 Angular App 时遇到的问题。
这个问题可以通过使用 ng-bind 来解决,这也是利用了 ng-bind 和双括号在可见性的区别。
使用双括号时,HTML 加载时,会将这个注释视为字符串,直接打印出来;而使用 ng-bind 的时候,因为 ng-bind 是作为 HTML 元素的属性,因此对于用户是不可见的,因此不会将变量或者表达式暴露出来。
p.s. 对于这个现象,还有另外一个解决方案,就是使用 ng-cloak,配合 css 的属性选择器,在 Angular 脚本加载完成前,将带有 ng-cloak 指令的节点隐藏掉,即:
但是这个方法美中不足的在于,angular 加载完成之前,添加了这个指令的元素会处于空白状态,特别的,加在 body 时,会出现白屏状态。
性能
并不是只因为使用双括号会暴露表达式就推荐使用 ng-bind 的。更重要的是两者在性能方面上的差异。
事实上,使用双括号,速度相对较慢。(这里是指数据较多的情况,下同)
造成性能差异的原因是:
首先对于双括号来说,angular 会在每次 $digest 循环时对花括号内的变量进行检查,并且将变量的值重新输出到 HTML 中;
而对于 ng-bind 这个指令来说,它会被放置一个 watcher 监听器,只有当监听器监听到它绑定的变量的值发生变化时,ng-bind 才会应用,更新绑定变量的值
引用 stackoverflow 里一位叫 Konstantin Krass 的朋友的尝试:
I am currently building a big single page app (~500 bindings per view). Changing from {{}} to strict ng-bind did save us about 20% in every scope.$digest.