2015-01-11 3 views
1

Я наткнулся на странную проблему с ng-опциями. Рассмотрим простой выбор:угловой: странное поведение с ng-опциями

<select ng-model="x" ng-options="n for n in [1,2,3]"></select> 

где значение модель получает назначение в контроллере:

$scope.x = 3; 

Это прекрасно работает; Выбрать элемент показывает 3. Однако, если назначение задержки,

$timeout(function() { $scope.x = 3 }, 50); 

ВЫБРАТЬ показывает пустой. Но только, если значение модели является последней опцией в списке! Другими словами, это работает отлично:

$timeout(function() { $scope.x = 2 }, 50); 

Затем выберите элемент показывает 2. То же дело с 1. Но 3 показывает пустым.

Что такое?

Это plunk, который демонстрирует.

Это проблема, которая проявляется с угловым 1.2.26. Более ранние версии в порядке (вы можете это увидеть сами, изменив угловую версию, используемую плунгом).

Но мой проект имеет все виды зависимостей, и беседка продолжает толкать мой угол до 1.2.29. Кто-нибудь понял, как я могу обойти эту проблему?

+0

Интересно. Кажется, это ошибка в 1.2.26/1.2.28. Если вы переключитесь на 1.3, он отлично работает. – pixelbits

ответ

0

Это, кажется, ошибка в версии 1.2.26/1.2.28, но работает для 1.3. *.

Я представил это как вопрос к Угловому:

https://github.com/angular/angular.js/issues/10718

Чтобы обойти эту проблему, инициализировать переменную область видимости в вашем ngController (за пределами $ таймаута):

function ctrl($scope, $timeout) { 
    $scope.p_immediate = 3; 
    $scope.s_immediate = "third"; 
    $scope.p_delayed = 0; 
    $scope.s_delayed = "first"; 
    $timeout(function() { 
     $scope.p_delayed = 3; 
     $scope.p_not_last = 2; 
     $scope.s_delayed = "third"; 
     $scope.s_not_last = "second"; 
    }, 50); 
} 

Demo

1

У меня была такая же проблема, и в итоге я решил, что css не будет отображать следующие параметры:

option[value^=\?]{ 
    display: none; 
} 

Это говорит о том, что CSS не отображает какой-либо параметр со значением значения атрибута, начинающимся с "?" (Обратите внимание, что знак вопроса должен быть экранирован.)