Подтвердить что ты не робот

Как оценить значения атрибутов в директиве?

Есть ли хороший способ, чтобы директивы 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.

4b9b3361

Ответ 1

Как уже упоминалось в комментарии @Ajay, вы можете использовать scope.recipient. Это работает, потому что вы создали область выделения в своей директиве:

scope: {    
   recipient: "="
},

Это создает свойство области директивы с именем recipient, которое представляет собой двустороннюю привязку данных к свойству родительской области. Какое родительское свойство? Тот, который определяется вашим атрибутом: recipient="teacher.email" – поэтому свойство parent scope teacher.email обязано изолировать свойство scope recipient.

Если ваша директива не будет изменять значение recipient, вы, вероятно, должны использовать '@' вместо '='. '@' дает нам "односторонние строки":

scope: {    
   recipient: "@"
},

Вам нужно будет изменить свой HTML:

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

В функции sendEmail() мы все равно можем использовать scope.recipient, как и для '='.


Если вместо этого использовать scope: true, директива создаст "нормальную" дочернюю область, а не область выделения. В директиве мы тогда использовали бы

scope.$eval(attrs.recipient)

чтобы получить значение. Это работает из-за того, как работает прототипное наследование JavaScript. $eval будет искать свойство teacher.email и не будет находить его в управляющей области. Затем он следует цепочке прототипов в родительскую область и находит ее там.