2017-01-17 3 views
1

У меня есть элемент формы с обработчиком изменения ng. Я хочу программно запускать обработчик, но без прямого контроля объема. Я хочу сделать это, потому что я пишу расширение Chrome, поэтому я не могу легко получить доступ к «$ scope», чтобы получить обработчик.Как запрограммировать угловые манипуляторы?

Я попытался очевидный выбор

$(element).triggerHandler('change') 

, но это не похоже на работу. См. Пример здесь: https://plnkr.co/edit/iaz7trxVT09XWBktGhE9?p=preview (в этом примере я регистрирую некоторые строки для консоли, когда выполняется обработчик изменений, но нажатие кнопки не регистрирует эти строки).

Я пробовал несколько других методов, найденных в различных потоках здесь, таких как trigger() или ручная конструкция события и огонь с диспетчером, но безрезультатно. Я не совсем понимаю, почему обработчик событий не запускается. Может ли кто-нибудь помочь?

+0

В отличие от других 'ng- ' директив, 'ng-change' не привязан к событию' change' базового элемента. Он привязан к '$ viewChangeListeners'' ng-model', поэтому нет способа вызвать его вручную, если у вас нет доступа к области tge. Почему вы используете 'ng-change'? Вместо этого будет работать «ng-input»? – gkalpak

+0

Спасибо. Это многое объясняет! Я не могу управлять страницей, поскольку я пишу расширение Chrome для заполнения форм, но это объясняет, почему мой код не работал! – user3759055

+0

Фактически вы можете получить доступ к $ scope из внешнего мира с помощью 'scope = angular.element ($ (element)). Scope()', поэтому нет необходимости запускать 'change' – Icycool

ответ

1

Ну, очевидно (согласно docs), изменение модели не будет срабатывать, когда значение не будет изменено. Некрасиво (но эффективный) обходной путь будет на самом деле изменить значение кратко:

var v = $('#testField1').val(); 
$('#testField1').val(0) 
$('#testField1').triggerHandler('change'); 
$('#testField1').val(v) 
$('#testField1').triggerHandler('change'); 

Конечно, это вызовет событие в два раза, если это проблема, которую вы могли бы, например, использовать известную «магическое значение» (например, мин отрицательное целое) и игнорировать его.

В качестве альтернативы, я боюсь, что нет простого решения: вам может потребоваться доступ к области/контроллеру для вызова функции, которую вы хотите напрямую, или вмешиваться в обработку событий углов.

+0

Это похоже на работу! Благодаря! – user3759055

Смежные вопросы