Я только что обнаружил странную функцию/ошибку в 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
все еще установлен).
Почему это происходит? Это странная особенность, которую я не могу понять или это ошибка? Я делаю что-то неправильно? Вы знаете решение этой проблемы?
Когда вы устанавливаете список:
$scope.list = [];
Это вызывает изменение ng, поскольку оно изменяет список опций, который изменяет входное значение.
Я вижу, что вы выделили: если модель изменена программно, а не изменением входного значения.
В этом случае вы не меняете модель программно.