2013-04-30 31 views
16

ディレクティブの内部から属性値にアクセスする方法はありますか?AngularJsディレクティブ - ディレクティブ内から属性値を取得する方法

angular.module('portal.directives', []) 
     .directive('languageFlag', ['$routeParams', function(params) { 
      return function(scope, element, attrs) { 
       console.log(attrs["data-key"]); // returns undefined 
       console.log(element.attr('data-key')); // returns {{data-key}} 
       angular.element(element).css('border', '1px solid red'); 
      }; 
     }]); 

HTMLコードです:

<ul> 
    <li ng-repeat="lng in flags"> 
     <a class="lngFlag {{flag.Key}}" data-key="{{flag.Key}}" data-id="{{lng.Id}}" ng-click="changeLangHash({'lng':lng.Id })" language-flag></a> 
    </li> 
</ul> 

おかげ

+0

ダッシュの場合はキャメルケースに従います - –

答えて

23

と同じよう$interpolateを使用することができます:

補間観察が属性:補間を含む属性の値の変化を観察するために使用$observeを(例えば、 src="{{bar}}")。これは非常に効率的であるだけでなく、実際の値を簡単に取得する唯一の方法でもあります。リンクフェーズではまだ補間が評価されていないため、この時点で値はundefinedに設定されています。 - directives doc

return function(scope, element, attrs) { 
    attrs.$observe('key', function(value) { 
     console.log('key=', value); 
    }); 
} 

@FMMコメントで述べたように、それはむしろdataKeyより上記keyの従って使用、属性名を正規化するとき、data、角度によって剥離されます。

+1

ありがとうございます。これは、スネーク表記を持つもの以外のすべての属性で機能します。データなど。しかし、実際には他の属性と連携しているので、私はあなたの答えを受け入れます。 私はあなたの努力と時間を感謝します。 –

+2

angleは 'data'プレフィックス(http://docs.angularjs。)をトリミングしている可能性があります。org/guide/directive): "オプションで、x-やdata-の接頭辞を付けてHTMLバリデータに準拠させることができます。"あなたの(論理的な)属性名を "データ"で始めることはおそらく悪い考えです。 – FMM

10

attrs["dataKey"]を試してみてください - これは、HTMLがダッシュ(-)と属性を解析する方法です。あなたの代わりに{{something}}の範囲から値をしたい場合 に、あなたは二つのことを行うことができます。

scope[attrs['dataKey']]を - 動作しますが、この

を行うか$parseを使うべきではありませんが、その後{{ ``使用しないでください}} `

app.directive('languageFlag', ['$routeParams','$parse', function(params,$parse) { 
    return function(scope, element, attrs) { 
    var value = $parse(attrs.dataKey)(scope); 
    console.log(value); 
    angular.element(element).css('border', '1px solid red'); 
    }; 
}]); 

またはあなたが使用$observe$parseのようなものの{{}}

+0

お返事ありがとうございます。 console.log(attrs ["dataKey"]); // =未定義 console.log(スコープ[attrs ['dataKey']]); // = undefined {{}}をすべて削除して$ parseを試みましたが、まだ未定義です。バインド時に基礎となるモデルに単純にアクセスする方法はありませんか? –

+0

親のスコープを$ parse(ex: '$ parse(attrs.uid)($ scope。$ parent)'に渡す)は私の問題を解決しました – manikanta

+0

@ g00fyしかし属性が双方向バインドされた値ならどうなりますか?私のコードはディレクティブのロード時にのみ解析しますが、(親スコープの)変数に加えられた変更には気付かないでしょう。 –

1

私あなたがattrsになるディレクティブのリンク機能、内部にある場合は、オブジェクトの表記法を使用することをお勧めします:

4

角度ストリップ「データ - 」は任意の属性をオフ、もしそうであれば

attrs.yourAttributeNameをあなたの属性は 'data-key'です。 'dataKey'ではなく 'key'を使用してください。

+0

私は "data-actiontype"という名前の属性を持っていますが、その属性からデータを取得していません。その名前はあらかじめ定義されていますか? – Kathir

+0

@Kathirあなたのコードを見ずに言うのは難しいです。あなたが14時間前に尋ねてきたので、うまくいけば分かりました。そうでない場合は、このページの回答を見て、いくつかのことを試してみることができます。 –

+0

ご返信ありがとうございます。 ''の下にある私のタグを見てください。タグから 'data-'を削除します。私はまだ考え出されていない。 – Kathir

関連する問題