ng-if 语句以一种方式工作而不是另一种方式,为什么?

ng-if statement works one way but not another, why?

当我这样写我的 ng-if 语句时...

ng-if="$state.params.Step != vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 2 && vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 1"

根本不起作用。我认为以上只是...

的缩写形式

ng-if="$state.params.Step != vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 2 && $state.params.Step != vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 1"

我做错了什么?如果可以的话,我不想重复自己。

你做错的不是重复你自己。 :-)

Angular 像 JavaScript 那样评估表达式(我认为它实际上使用 JavaScript 来完成它,但我没有在 covesr 下检查过)。 JavaScript,就像几乎所有语法源自 B 的语言一样(C、C++、C#、Java、JavaScript,...)没有 x != a && bx != a || b,你必须拼写出来:x != a && x != bx != a || x != b。就是这样。

你没有得到 error 的唯一原因是 JavaScript 有类型强制,所以 x != a && b 计算为 (x != a) && b,最终成为 true && bfalse && bb 然后根据通常的规则被强制为布尔值(任何 falsy 最终成为 false,其他一切最终成为 true)。 (falsy 值是 0""NaNnullundefined,当然,false.)

ng-if="$state.params.Step != vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 2 && vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 1"

这基本上是在说:

($state.params.Step != vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 2) &&
 vm.$localStorage.builder[$state.params.ID].Data.Steps.length - 1

然后将 && 的结果与最后一个数字进行比较。有效的;几乎肯定不是你想要的。

几乎肯定应该将此逻辑移出 ng-if,因为它几乎无法阅读。