Подтвердить что ты не робот

Почему я получаю разные результаты от ng-show = "! EmptyArray" и ng-hide = "emptyArray"?

Я всегда думал, что ngShow и ngHide действуют как логические эквиваленты друг другу. Однако эта вера потрясена неожиданным поведением ngShow, когда задействован пустой массив.

Ниже представлен демонстрационный плунжер . Почему не ng-show="!emptyArray" ведет себя как ng-hide="emptyArray"?

4b9b3361

Ответ 1

Потому что [] !== false. Вместо значения boolean можно привязать значение длины к 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.

Надеюсь, что это поможет.

Ответ 2

ng-if и ng-show mistreats "[]" (пустой массив)

Смотрите: ссылка

[] == true
false

 [] != true
 true

(![]) == true
false

[''] == true
false

(!['']) == true
false

"" == true
false

"[]" == true
false

(!"[]") == true
false

Звучит по дизайну.

Ответ 3

Я использую что-то вроде этого, оно работает со мной

ng-hide="array.length == 0"