'ng'字符在ng-show中被认为是真实的

时间:2014-03-05 19:24:08

标签: angularjs

使用角度时,我有一个非常奇怪的问题:

<div ng-app>
    <textarea ng-model="resp" placeholder="Response"></textarea>
    <a ng-show="resp">Respond</a>
</div>

Fiddle

在textarea中写入内容时,会显示Respond链接。

然而,奇怪的是,在写字母'f'时,“回复”按钮不会显示。

对此的解决方法是使用条件resp.length>0,但我想知道为什么字母'f'以特殊方式运行。

4 个答案:

答案 0 :(得分:8)

实际上'f'被视为false

AngularJS在内部使用toBoolean函数来评估ng-show / ng-hide表达式。

你应该对“f”,“false”,“0”,“n”,“no”和“[]”获得相同的行为。

您可以在此处详细了解:https://github.com/angular/angular.js/issues/1229

这是angular toBoolean函数:

function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else 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;
}

更新

在AngularJS 1.3+中,此行为已被删除。

引用:由于bdfc9c02,值'f','0','false','no','n','[]'不再被视为麻痹。现在,表达式解析器将唯一被视为伪造的JavaScript值为:false,null,undefined,NaN,0和“”。

答案 1 :(得分:1)

我的建议是检查resp是否为空字符串。由于textarea是字符串值,如果字符串不为空,则会显示您的回复文本。

<div ng-app>
    <textarea ng-model="resp" placeholder="Response"></textarea>
    <a ng-show="resp != ''">Respond</a>
</div>

答案 2 :(得分:0)

恰恰相反,"f"被视为false。请注意以下所有内容:

"F"
"false"
"FALSE"
"FaLsE"
"  faLse "
""
" "
"   "

(即,案例和前导/尾随空格无关紧要)

但是,部分字词(例如"fa", "fal", "fals")不是。

答案 3 :(得分:0)

使用严格的条件检查检查。 'F','f','N','n','0'也不适用于你的小提琴。它们被认为是“虚假”的捷径。输入'false'也无法显示'Respond'按钮。