Почему {{isNan (x)}} не работает в angularJS?

Обратите внимание, что заголовок этого вопроса изменился на тот, который больше сфокусирован на точной проблеме. См. Поток комментариев, чтобы следить за тем, как я понял, что проблема заключается в том, что AngularJS, похоже, не обрабатывает {{isNaN()}}

В моем HTML есть следующее:

xx {{ option.selectedSubject }} yy {{ (option.selectedSubject == null) }} zz

и я также попытался:

xx {{ option.selectedSubject }} yy {{ option.selectedSubject == null }} z

и

xx {{ option.selectedSubject }} yy {{ option.selectedSubject === null }} zz

Может кто-нибудь объяснить мне, почему я получаю следующее для каждого из вышеперечисленных при просмотре моей страницы:

xx null yy false zz

Обновление 1 Я пробовал следующее:

aa {{ option.selectedSubject === "null" }} bb {{ option.selectedSubject == "null" }} cc

и он дает следующее:

aa false bb false cc

Обновление 2 Я не уверен, что это помогает, но вот что заполняет значения option.selectedSubject. В этом случае в локальном хранилище ничего нет:

$scope.option.selectedSubject = parseInt(localStorage.get('selectedSubject'));

Когда я проверяю значение $scope.option.selectedSubject, оно NaN

Ответы

Ответ 1

Проблема здесь не isNaN. Проблема в том, что вы вызываете функцию в переменной $scope, которая не существует.

Каждая интерполированная часть текста ('{{text}}') связана с переменной $scope и оценивается с этой переменной области $scope.

Чтобы облегчить вам задачу, $scope.property может быть создан "на лету", если он не существует. Каждый раз, когда вы используете ngModel = 'someProperty' или {{aPropertyName}}, тогда corressponding $scope.someProperty или $scope.aPropertyName создается автоматически, если он еще не существует. Однако этот ярлык работает только с примитивами.

Функциональные вызовы всегда оцениваются по $scope и никогда не создаются. Вот почему вы должны сказать $scope.isNaN = isNaN, как вы нашли в своем предыдущем комментарии.

Попробуйте использовать любую функцию. isArray, isNumber и т.д. Это не сработает, если вы не поставили объект $scope.functionName = functionName в контроллере.

Edit: Кроме того, если вы действительно хотите выполнить тест isNaN прямо в интерполяции, вы можете воспользоваться системой типа javascript и использовать

{{ property != property }}

Но это плохая форма...

http://plnkr.co/edit/wfLqzk8QxScsJPF5qY12?p=preview

Ответ 2

Изменить: Исходный вопрос: Могу ли я пройти тест внутри {{}} в angularJS?, а $scope.option.selectedSubject должен быть null, а не NaN. Автору должен быть открыт другой вопрос, а не менять его на совершенно другой.


Ответ на исходный вопрос:

Вы можете поместить выражение внутри своей привязки, поэтому вы можете проверить {{option.selectedSubject == null}}. Проверьте свою область действия, если результат оценки не соответствует ожидаемому.