我一直以为ngShow
和ngHide
互相充当 bool(boolean) 对象。但是,当涉及到空数组时,ngShow
的意外行为会撼动这一信念。
这是一个demo plunker。为什么ng-show="!emptyArray"
的行为不像ng-hide="emptyArray"
?
请您参考如下方法:
因为[] !== false
。您可以将长度值强制改为boolean
,而不是!!
。
<div ng-hide="!!emptyArray.length">emptyArray is falsy, so do not hide this.</div>
<div ng-show="!!!emptyArray.length">!emptyArray is truthy, so show this.</div>
编辑:
AngularJS的指令
hide
或
show
取决于函数
toBoolean()
来评估传入的值。这是
toBoolean()的源代码:
function toBoolean(value) {
if (value && value.length !== 0) {
var v = lowercase("" + value);
value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
} else {
value = false;
}
return value;
}
您可以在JS控制台中验证以下代码:
>var emptyArray = [];
>toBoolean(emptyArray)
false
>toBoolean(!emptyArray)
false
这就解释了为什么。由于将
emptyArray
直接传递到
toBoolean()
时,它将评估正确的结果
false
。但是,当
!emptyArray
传递给
toBoolean()
时,由于
true
本身就是
!emptyArray
,因此它的计算结果不等于
false
。
希望能帮助到你。