Как вызвать ng-изменение из jquery?

19

У меня есть тег select следующим образом:

<select ng-change="doSomething()" ng-model="myModel"> </select>

, и я использую для него элемент управления jQueryUI (combobox), событие «change», вызванное jQuery, не вызывает doSomething ().

Вы знаете, как вызвать ng-изменение из внешнего углового?

    
задан htellez 20.06.2014 в 17:14
источник

2 ответа

4

Ugh - это ужасная практика, но вы можете использовать angular.element и получить scope от элемента, который находится в целевом контроллере.

Пример:

<div ng-controller="myApp">
    <span id="test"></span>
</div>

JavaScript:

var scope = angular.element("#test").scope();
scope.doSomething();

Теперь ваша переменная scope имеет доступ ко всем методам, определенным на контроллере myApp .

    
ответ дан tymeJV 20.06.2014 в 17:20
  • Если это ужасная практика, то что делать с элементами ввода, которые заполнены значением по умолчанию на сервере? –  Lawyerson 19.05.2016 в 17:40
  • @BauceLawyerson - не заполнять атрибут входного значения - вместо этого разобрать значение сервера через Angular и назначить его правильной переменной ngModel. –  tymeJV 19.05.2016 в 17:51
  • Это работает только в режиме отладки. angular.element ("# id"). scope () недоступен в режиме деблокирования. см. раздел «Извлечение областей из DOM». ссылка –  Cesar 10.08.2017 в 15:56
45

Вопрос заключается не в том, как запустить некоторый код, а в том, как инициировать событие изменения. Я нашел удобный для этого способ. У меня есть слайдер jQuery UI, который изменяет значение другого ввода, на котором есть ng-изменение. Секрет в том, что как только вы превратите его в угловой элемент, теперь у вас есть доступ к методу triggerHandler. Из того, что я видел, использование этого не будет считаться плохой практикой:

angular.element(document.getElementById('test')).triggerHandler('change');

Ответ tymeJV сделал angular.element("#test") напрямую, не используя jQuery, но я получил консольную ошибку и сломанную функциональность таким образом. Эта версия работает без каких-либо зависимостей.

    
ответ дан claywhipkey 10.04.2015 в 18:26
  • Это именно то, что мне нужно, когда jQuery .trigger ('change') не работал. Благодаря! –  pappy 28.12.2016 в 12:27
  • Именно это я и искал. Это позволяет вам запускать метод ng-change на элементе прагматически через javascript. Очень полезно, когда у вас есть настраиваемая директива, которая обрабатывает ваш вход, и вам нужно вызвать функцию изменения при изменении входной доли. –  Xenology 29.01.2018 в 09:56