2017-01-17 4 views
1

私は、ng-changeハンドラを持つフォーム要素を持っています。私はプログラムでハンドラをトリガしたいが、スコープを直接調べることはしない。私はこれをやりたいのですが、Chromeの拡張機能を書いているので、ハンドラを得るために '$ scope'に簡単にアクセスすることができません。角度ハンドラをプログラムでトリガする方法は?

私は

$(element).triggerHandler('change') 

の明白な選択を試してみましたが、それは動作するようには思えません。ここでの例を参照してください:https://plnkr.co/edit/iaz7trxVT09XWBktGhE9?p=preview(この例では、変更ハンドラが実行されているときにコンソールにいくつかの行を記録していますが、ボタンをクリックするとその行は記録されません)。

ここでは、trigger()やdispatchEventを使用したイベントと火災の手動構築など、さまざまなスレッドで見つかったいくつかのメソッドを試しましたが、役に立たないものです。なぜ私はイベントハンドラがトリガしていないのかよく分かりません。誰も助けることができますか?

+0

他の 'ng-'ディレクティブとは異なり、 'ng-change'は基本要素の' change'イベントにバインドされていません。 'ng-model'の' $ viewChangeListeners'にバインドされているので、あなたがtgeスコープにアクセスできる場合を除き、手動で呼び出す方法はありません。なぜあなたは 'ng-change'を使っていますか? 'ng-input'は代わりに使えますか? – gkalpak

+0

ありがとうございます。それはたくさん説明します!私はフォームを記入するためにChrome拡張機能を書いているので、ページを制御することはできませんが、これは私のコードがうまくいかない理由を説明しています! – user3759055

+0

実際には、スコープ= angle.element($(element))。scope() 'を使って外部から$ scopeにアクセスすることができますので、' change'をトリガーする必要はありません。 – Icycool

答えて

1

明らかに(docsによると)、値が変更されていない場合、モデルの変更はトリガーされません。醜い(未発効)回避策は、実際に簡単に値を変更するには、次のようになります。これはあなたが例えば知られている「魔法の値を」使用することができ、問題がある場合、これは、二回イベントがトリガされますもちろん

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

(例えばmin負の整数)、それを無視します。

また、簡単な解決法はありません。あなたが直接必要とする機能を呼び出すためにスコープ/コントローラにアクセスする必要があるかもしれません。

+0

それはうまくいくようです!ありがとう! – user3759055

関連する問題