Я столкнулся с этим при переходе с 1.2.14 на 1.4.8. Это отлично работает в 1.2.14, но я получаю бесконечный цикл $ digest() в 1.4.8. Вот Fiddle, демонстрирующий проблему. Fiddle намного легче смотреть на чем этот пост, но SO делает меня включить код
У меня есть select
элемент, который выглядит следующим образом:
<select ng-model="selectedId" ng-options="opt.id as opt.label for opt in getOptions()">
Мои параметры являются объектами, как это:
$scope.options = [ { id: 1, label: 'one' }, { id: 2, label: 'two' } ];
Массив параметров, которые я хочу дать директиве ngOptions, зависит от условий; иногда я просто хочу дать ему $scope.options
, но иногда я хочу включить другой вариант.
$scope.getOptions = function() {
if ($scope.showThirdOption)
return [{ id: 3, label: 'three' }].concat($scope.options);
else
return $scope.options;
};
Теперь, если я программно установить свою модель до 3:
...
$scope.selectedId = 3;
...
... Угловой не расстраиваться, даже если этот параметр не существует. Он просто добавляет узел <option>
в элемент <select>
: <option value="?" selected="selected"></option>
, а выбранное значение в раскрывающемся списке отображается пустым.
Но если я тогда установил свое состояние s.t. мои getOptions() возвращает, что дополнительные опции:
...
$scope.selectedId = 3;
$scope.showThirdOption = true;
...
... Я получаю бесконечный $ дайджеста() цикла.
Есть хороший способ избежать проблемы, как это? Считаете ли вы, что это ошибка в Angular (технически это регрессия), или это просто ... не способ, которым я должен использовать ngOptions?
~~~ Again, I have a nice Fiddle for you to play around with!! ~~~
Вот пример, показывающий, что эта проблема не возникает, если ваши параметры являются значениями вместо объектов: [** http: //jsfiddle.net/x15jccmj/3**] (http://jsfiddle.net/x15jccmj/3/). –