是否有一种很好的方法让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
。
答案 0 :(得分: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
,而不是在指令子范围内找到它。然后它遵循原型链到父作用域并在那里找到它。