2016-09-21 31 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事件綁定到單擊時將調用新功能的元素)。