2015-12-16 3 views
7

Я столкнулся с этим при переходе с 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; 
... 

... Я получаю бесконечный $ дайджеста() цикла.

errors loop bad

Есть хороший способ избежать проблемы, как это? Считаете ли вы, что это ошибка в Angular (технически это регрессия), или это просто ... не способ, которым я должен использовать ngOptions?

~~~ Again, I have a nice Fiddle for you to play around with!! ~~~

+0

Вот пример, показывающий, что эта проблема не возникает, если ваши параметры являются значениями вместо объектов: [** http: //jsfiddle.net/x15jccmj/3**] (http://jsfiddle.net/x15jccmj/3/). –

ответ

2

ошибка происходит потому, что вы вызываете функцию getOptions() в нг-опций. Создать новую переменную и присвоить значение, возвращаемое этой функцией, а затем использовать его в нг-опций:

$scope.newOptions = $scope.getOptions(); 

ng-options="opt.id as opt.label for opt in newOptions" 

Также не забудьте обновить NewOptions на кнопку мыши.

Тогда у вас не будет бесконечного дайджеста. См. Обновленный скрипт: http://jsfiddle.net/bbcjeuhb/

+0

Спасибо, это сработало отлично !! : D –