2016-09-21 2 views
0

Я переживаю это doc, путаница у меня есть, что это «это» в link.apply (это, 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; 
    }); 
}); 

когда я пытаюсь отлаживать его с помощью консоли отладчика, «это» не определено, а функция ссылка работает.

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply – Sai

ответ

1

В угловом декораторе нет специального this контекста, поэтому он может быть window в свободном режиме или undefined в строгом режиме.

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

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

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

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

0

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

Смежные вопросы