@cubooks
Web-developer

Как Angular.JS работает с select?

Добрый вечер. Мне стало интересно, как работает Angular.JS с select. Например, у меня есть такой список

HTML (фрагмент):
...
<select ng-model="form.currency" ng-options="c as c.label for c in currencies"></select>

{form | json}
...


Javascript (фрагмент внутри контроллера):
$scope.currencies = [
        {label : 'Доллары', value : 'usd'} ,
        {label : 'Евро' , value : 'eur'}
    ];


Всё работает исправно, если я изменяю данные из браузера. Но если мне требуется изменить выбранный элемент с помощью Javascript в процессе работы со списком, то модель не меняется.

select.find('option').eq(1).prop('selected' , true);


Не подскажите, как перехватить этот момент, чтобы модель исправно менялась?
  • Вопрос задан
  • 3172 просмотра
Решения вопроса 2
@Demetros
Сейчас нет возможности проверить, но возможно после такого изменения надо сделать

angular.element(select).scope().$apply();
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Вам нужно вызвать вотчеры. Для этого можно вызвать $apply() или $digest().
$apply() вызывает $rootScope.$digest(), что в свою очередь запускает все вотчеры во всех скоупах.
Если же вызвать $scope.$digest(), то произойдет обновление лишь нужного scope. Подвох в том, что $digest() нельзя вызывать внутри "фаз". Лечится очень простым способом.

select.find('option').eq(1).prop('selected' , true);
var selectScope = angular.element(select).scope();
selectScope.$$phase || selectScope.$digest();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы