Angular项目需求开发中偶遇小坑,发现利用ngModel
绑定值后,监测不到值的变化.
于是简单写了个demo复现了这种情况:
这种情况发生在ng-if
中嵌套一个ng-model
,ng-model
就会无效.
AngularJS中ng-show
,ng-hide
,ng-if
用来控制DOM元素的显示和隐藏,
不同的是ng-show
和ng-hide
是通过计算表达式的值来控制增加还是删除DOM元素的类名(ng-hide
),详细见源码:
ng-hide
类名是控制CSS的display
属性值.
然而,ng-if
指令是根据表达式的值增加或者移除一个DOM元素:
当表达式为false
的时候,ng-if
指令会移除创建好的元素,并且销毁与之相关的childScope
.
当表达式为true
的时候,ng-if
指令会重新创建DOM元素,并且会从它的父作用域上继承一个新的子作用域.
这就意味着ng-if
会新建新的作用域.这一点我们可以从JavaScript
原型来理解:
对于从原型对象继承而来的成员,其读和写具有内在的不对等性.
举个例子:
在上述例子中可以发现,当改变a
的name
时,不会改变原型中的属性.当改变a
中info
对象的属性时,由于对象是引用的,所以也改变了引用对象的属性.
由此我们可以对这个小坑提出解决方法,可以在ng-if
下ng-model
赋值的属性,提供一个外部对象的引用:
上面还提到一种解决方式,通过$parent
引用到外部作用域的属性,也可以解决这个小坑.不过当你ng-if
嵌套多层时,这种方法就显然不合适了.