Что такое "это" в угловом декораторе?
Я просматриваю этот документ, у меня путаница в том, что такое "это" в 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 с элементом, который будет вызывать новую функцию при нажатии).