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(请注意,链接函数具有正确的值scope.$parent.teacher)而不是字符串teacher.email

4

1 回答 1

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,而不是在指令子范围内找到它。然后它沿着原型链到达父范围并在那里找到它。

于 2013-03-19T18:48:42.840 回答