2016-09-21 103 views
0

我正在通过这个doc,我的困惑是link.apply(this,attrs)中的'this'是什么。有人可以帮忙吗?角装饰者中的'this'是什么?

$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'在链接函数运行时未定义。

+0

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

回答

1

有在角装饰无特殊this背景,所以它可能是松散模式windowundefined严格模式。

在嵌套函数this可以指非词汇上下文,它可以发生在角指令:

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是控制器实例。 link函数中没有词汇this

link.apply(this, arguments)是一个尝试玩安全,但在这里它只是误导。相反,它可能是link.apply(null, arguments)

0

您需要创建一个编译函数,它将返回您的新链接函数。
在那里,您可以在旧链接函数中调用apply(作为函数本身的第一个参数传递)以获得旧功能。
使用该设置,您只需添加额外的行为(在这种情况下,您将click事件绑定到单击时将调用新功能的元素)。