Вход ng-list не обновляется при добавлении элементов в массив

У меня запуталась странная проблема, когда ввод с использованием ng-list не обновляется при добавлении элементов в модель. Я создал скрипку, чтобы лучше проиллюстрировать проблему: http://jsfiddle.net/rtZY3/

// Doesn't update ng-list input
$scope.tags.push(tag);

// Does update ng-list input
var tags = angular.copy($scope.tags);
tags.push(tag);
$scope.tags = tags;

Это не похоже на ожидаемое поведение, тем более что $scope.tags правильно обновляется, как показано тегом <pre> в jsFiddle выше.

Ответ 1

Хорошо, так что это было интересно. Я выкопал в неиспользуемый исходный код AngularJS для директива ngList.

Кажется, что в первом примере не запускается функция форматирования, которая является функцией, которая разделяет значения массива в строку, разделенную запятыми, которая отображается в поле ввода.

Дальнейшее исследование показывает, что ошибка лежит в директиве ngModel . Formatters вызывается только в том случае, если значение строго не равно предыдущему значению, но поскольку это один и тот же экземпляр массива в вашем первом примере, этот оператор оценивается как false, и, следовательно, текстовое поле не обновляется. См. исходный код.

$scope.$watch(function ngModelWatch() {
    var value = ngModelGet($scope);

    // $modelValue and value is the same array instance in your first example
    if (ctrl.$modelValue !== value) {
        // ...
    }
});

В вашем втором примере вы каждый раз создаете новый экземпляр массива и, следовательно, выполняете форматирование.