Запуск события ng-change программно из JavaScript

#javascript #html #angularjs

#JavaScript #HTML #angularjs

Вопрос:

Я пытаюсь запустить событие ng-change программно из некоторого javascript.

Это элемент, для которого я пытаюсь запустить событие ng-change

 <select ng-model="user.siteId" name="siteSelect" ng-change="user.setSelectedSite(user.siteId)" class="ng-pristine ng-untouched ng-valid ng-empty">
    <option value="" selected="selected">Please Select A Site</option>
    <option id="siteOpts" value="1" ng-repeat="site in user.sites  | orderBy:'siteName'" class="ng-binding ng-scope">Site1</option>
    <option id="siteOpts" value="2" ng-repeat="site in user.sites  | orderBy:'siteName'" class="ng-binding ng-scope">Site2</option>#
    <option id="siteOpts" value="3" ng-repeat="site in user.sites  | orderBy:'siteName'" class="ng-binding ng-scope">Site3</option>
</select>
 

Я знаю, что могу выбрать значение, используя этот код

 document.querySelector('.ng-pristine.ng-untouched.ng-valid.ng-empty').value = 2;
 

Однако это не приводит к запуску события ng-change.

Как я могу выбрать значение и обеспечить запуск события ng-change?

Комментарии:

1. отслеживается значение модели, user.siteId = 2 вместо этого устанавливается

2. @svarog как мне установить значение модели из JS? user.SiteID = 2; не работает, потому что пользователь не определен.

3. вы делаете это в контроллере, определяете и объект user и добавляете свойство siteId со значением 2, например $scope.user = {}; $scope.user.siteID = 2;

Ответ №1:

Согласно документации

Выражение ngChange вычисляется только тогда, когда изменение входного значения приводит к тому, что новое значение фиксируется в модели.

Оно не будет оценено:

  • если значение, возвращенное из конвейера преобразования $parsers, не изменилось
  • если входные данные продолжали оставаться недействительными, поскольку модель останется нулевой
  • если модель изменяется программно, а не путем изменения входного значения

Обратите внимание, эта директива требует присутствия ngModel.

Что вы можете сделать, так это вручную вызвать вашу функцию из вашего контроллера

 user.setSelectedSite(user.siteId)
 

или используйте $scope. $watch .

Комментарии:

1. спасибо за помощь, у меня это работает следующим образом: angular.element(document.getElementsByTagName('BODY')[0]).scope().user.setSelectedSite(2)

2. @user2976138 Я рад, что смог помочь.

3. .scope() доступен только в режиме отладки