Выражение ngChange оценивается, когда для массива / объекта, используемого в ngOptions, установлено значение пусто / неопределено / пусто

0

Я только что обнаружил странную функцию/ошибку в Angular.js.

Допустим, у нас есть selectbox, где опции заполняются директивой ngOptions. Мы установили прослушиватель изменений в selectbox, используя директиву ngChange.

<select ng-model="model" ng-options="item for item in list" ng-change="foo()"></select>

Мы определяем область действия следующим образом:

$scope.list = [1,2,3,4,5];
$scope.model = 3;

$scope.foo = function() {
    console.log("change");
};

Затем мы где-то в коде сбросим массив следующим образом:

$scope.list = [];

Если мы посмотрим на консоль, мы увидим, что была вызвана функция foo() и записано "change". Однако пользователь не коснулся выбора и не изменил выбранное значение. Согласно документации

Выражение ngChange оценивается только тогда, когда изменение входного значения вызывает привязку нового значения к модели.

Он не будет оцениваться:

  • если значение, возвращаемое из конвейера трансформации $ parsers, не изменилось
  • если вход продолжает оставаться недействительным, так как модель останется нулевой
  • если модель изменена программно, а не изменением входного значения

Значение ввода не изменилось. Модель не изменилась. Программный код был изменен только с помощью массива (с объектом, который он по-разному использовал) для генерации опций.

Проверяя элемент select я также обнаружил, что класс ng-dirty был установлен в этот элемент, хотя пользователь никогда не касался selectbox (класс ng-untouched все еще установлен).

Почему это происходит? Это странная особенность, которую я не могу понять или это ошибка? Я делаю что-то неправильно? Вы знаете решение этой проблемы?

  • 0
    Значение входного сигнала изменяется , как только вы изменить массив, который используется для генерации вариантов.
  • 0
    Это не правда. Я могу изменить массив так, как захочу (добавить / удалить элементы, заменить весь массив), и модель не изменится, выражение ngChange не будет оценено. И это ожидаемое поведение. Только пустой / неопределенный / пустой массив / объект вызывает неожиданное поведение.
Показать ещё 5 комментариев
Теги:
drop-down-menu
ng-options
angularjs-ng-change

1 ответ

0

Когда вы устанавливаете список:

$scope.list = [];

Это вызывает изменение ng, поскольку оно изменяет список опций, который изменяет входное значение.

Я вижу, что вы выделили: если модель изменена программно, а не изменением входного значения.

В этом случае вы не меняете модель программно.

  • 0
    Это правда, я не изменяю модель программно в этом случае. Angular меняет модель. Что очень важно. Смотрите мой комментарий на мой вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню