2013-06-09 6 views
13

私はangularJSを使用しています。私は例えば、私のページには、いくつかの<select>要素、ng-change自身の持つそれぞれを持っています。ng-changeを引き起こしたDOM要素を取得するには?

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData()"> 

私はupdateUserData関数内から更新されてしまったDOM要素を決定することができるようにしたい、それを手動で指定しなくても、各ng-change属性のパラメータとして使用します。

eventまたはcallerなど、updateUserDataのコンテキスト内で使用できるものはありますか?

うまくいけば、設計することにより、これを行うには(簡単な)方法はありませんng-change="updateUserData(caller)"

+0

http://stackoverflow.com/questions/ 48239/get-the-id-of-the-event-using-jquery – Arunu

+2

@Arunu私はAngularJSを使用していますが、jQueryは使用していません。私はそれをより明確にするために質問を編集しました。 – OpherV

答えて

11

のようなもの。角型コントローラはDOMとは全く別のものであると考えられていますので、DOMを参照する必要がある場合は間違った方法で接近している可能性があります。

あなたのHTMLが

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData()"> 

されている場合は、選択を変更すると、お使いのコントローラに$scope.hairColorの値を変更します。 updateUserData()では、その値を読み取ってそれに応じて行動します。

DOMを参照する以外に実際に行う方法がない場合は、カスタムディレクティブを作成してください。一般に、Angularでの直接DOM操作は、最後の手段であるべきです。

+0

それは私が恐れていたものでした。私はどのデータが変更されたかを記録するDOM要素のIDを取得しようとしています。あなたはどうやって違うのですか?それぞれのデータ項目を別々に '$ watch'する? – OpherV

+1

私はあなたの正確な状況については分かりませんが、代わりにそのすべてを行うことができるようにngモデルを持っているならば、要素にidを持つ必要は全くないことがわかりました。あなたは$を見ることができます、またはそれぞれの選択のための別の変更方法があります。私が知っているDRYもそうではありませんが、DOMとコントローラを分離しておくことは、長期的にメンテナンスやテストのためにもっと簡単になります。 – mikel

2

Googleでこれが見つかりました。私は結局私の問題を解決しましたので、私の解決策です。

IDが必要な場合は、パラメータとして渡すことができます。

<select id="hairColorComponent" ng-model="hairColor" 
     ng-options="option.name for option in hairColorData" 
     ng-change="updateUserData('hairColorComponent')"> 

まだスーパークリーンではありませんが、私の問題を解決しました。実際にdom要素が必要なので、jQueryを使用して要素を取得しました。

$scope.updateUserData = function (id) { 
    var element = jQuery('#'+id); 
}; 

(不思議方のために、私は「魔法」のすべてのウェブサイト経由のページにユーザー設定を保存していること、レガシーコードを変換すると自分のベストをやっている。)

+0

「角度」ではありません。 コントローラーからUIを変更しています。これがディレクティブの目的です。 – Dementic

関連する問題