2013-03-19 52 views
14

有沒有一種好方法讓AngularJS指令評估作爲參數傳入的屬性?如何評估指令中的屬性值?

這裏有一個simplified example顯示我的問題(我承認你能實現這一行爲沒有指令):

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值(注意,鏈接功能有正確的值爲scope.$parent.teacher)而不是字符串teacher.email

+1

只需用scope.recipient替換attrs.recipient – 2013-03-19 18:26:43

回答

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,但未在指令子範圍上找到它。然後它遵循原型鏈到父範圍並在那裏找到它。