2013-03-19 28 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,但未在指令子范围上找到它。然后它遵循原型链到父范围并在那里找到它。