2013-03-19 29 views
14

AngularJSディレクティブがパラメータとして渡された属性を評価する良い方法はありますか?ディレクティブの属性値を評価するにはどうすればよいですか?

link: function postLink(scope, element, attrs) {  
     debugger; // scope.$parent already knows the value of teacher here 
     scope.sendEmail = function(){ 
      alert(attrs.recipient); 
      //window.open("mailto:" + attrs.recipient); 
     } 
    } 

私はteacher.emailの値を使用するための指示をしたいと思います(リンク機能を持っていることに注意してください:ここでは

は(私はあなたが指示なしにこの動作を実装することができ認識)私の問題を示すことsimplified exampleです文字列teacher.emailではなく、scope.$parent.teacherの正しい値)。

+1

attrs.recipientをscope.recipientに置き換えてください。 –

答えて

22

@Ajayはすでにコメントに記載されているので、scope.recipientを使用できます。あなたのディレクティブで分離株のスコープを作成したので、これは動作します:

scope: {  
    recipient: "=" 
}, 

これは親スコープのプロパティに双方向データバインドでrecipientという名前のディレクティブのスコープのプロパティを作成します。どの親の財産ですか?あなたの属性で定義されているもの:recipient="teacher.email" –したがって、親スコーププロパティteacher.emailはスコーププロパティrecipientを分離するようにバインドされています。

ディレクティブがrecipientの値を変更しない場合は、 '='の代わりに '@'を使用することをお勧めします。 '@' は私たちに、 "一方向の文字列" を与える:

scope: {  
    recipient: "@" 
}, 

あなたはしかし、あなたのHTMLを変更する必要があります:

<sendemail recipient="{{teacher.email}}"></sendemail> 

のsendEmail()関数では、我々はまだただ、scope.recipientを使用することができます私たちが '='のためにしたように。


私たちが代わりにscope: trueを使用している場合は、ディレクティブは「通常の」子スコープではなく、分離株のスコープを作成します。この指令では、値を得るために

scope.$eval(attrs.recipient) 

を使用します。これはJavaScriptのプロトタイプの継承が機能するために機能します。 $ evalはプロパティteacher.emailを探し、ディレクティブの子スコープでそれを見つけません。次に、プロトタイプチェーンを親スコープに追いつけて、それを見つけます。

関連する問題