Что такое "это" в угловом декораторе?

Я просматриваю этот документ, у меня путаница в том, что такое "это" в link.apply(this, attrs). Может кто-нибудь помочь?

 $provide.decorator('fooDirective', function($delegate) {
    var directive = $delegate[0];

    directive.scope.fn = "&";
    var link = directive.link;

    directive.compile = function() {
      return function(scope, element, attrs) {
        link.apply(this, arguments);
        element.bind('click', function() {
          scope.$apply(function() {
            scope.fn();
          });
        });
      };
    };

    return $delegate;
   });
 });

когда я пытаюсь отладить его с помощью консольного отладчика, 'this' не определено, пока работает функция link.

2 ответа

Решение

Там нет особенного this контекст в Angular Decorator, так что это может быть window в свободном режиме или undefined в строгом режиме.

Во вложенных функциях this может ссылаться на нелексический контекст, который может иметь место в директивах Angular:

directive.compile = function() {
  // `this` is directive DDO in compile function
  return function(scope, element, attrs) {
    // `this` is `undefined` in link function
    ...
  };
};

В compile функция this это директива DDO. В controller функция this это экземпляр контроллера. Там нет лексического this в link функция.

link.apply(this, arguments) это попытка играть осторожно, но здесь это просто вводит в заблуждение. Может быть link.apply(null, arguments) вместо.

Вам нужно создать функцию компиляции, которая будет возвращать вашу новую функцию ссылки.
Внутри вы вызываете apply (передавая в качестве первого параметра саму функцию) в старую функцию link, чтобы получить старую функциональность.
С этим набором вам просто нужно добавить дополнительное поведение (в этом случае вы связываете событие click с элементом, который будет вызывать новую функцию при нажатии).

Другие вопросы по тегам