2013-10-16 75 views
13

我正在嘗試使用Angular的「裝飾器」功能來爲某些指令添加功能。假設我的指令名稱是myDirective。我的代碼如下所示:角度 - 裝飾指令

angular.module('app').config([ 
    '$provide', function($provide) { 
    return $provide.decorator('myDirective', [ 
     '$delegate', '$log', function($delegate, $log) { 
     // TODO - It worked! Do something to modify the behavior 

     $log.info("In decorator"); 
     } 
    ]); 
    } 

]);

我不斷收到這樣的信息:

Uncaught Error: [$injector:unpr] Unknown provider: myDirectiveProvider from app 

要盡我最大的能力,這些指令已經由裝飾功能運行時註冊。任何有識之士將不勝感激!

+0

請參見:http://stackoverflow.com/questions/18335574/decorating-the-ng-click-directive-in-angularjs – XML

回答

20

本文展示瞭如何使用decorator()和指令。

您只需要包含「指令」作爲名稱的後綴。因此,在我的例子中,我應該做的事情

return $provide.decorator('myDirectiveDirective', ['$delegate', '$log', function($delegate, $log) { 
    // TODO - It worked! Do something to modify the behavior 
    $log.info("In decorator"); 

    // Article uses index 0 but I found that index 0 was "window" and index 1 was the directive 
    var directive = $delegate[1]; 
} 

http://angular-tips.com/blog/2013/09/experiment-decorating-directives/

+1

太棒了,你每天都會學到東西。在代碼中,看起來'$ delegate'應該是所有加載模塊名稱爲'myDirective'的所有指令的列表。似乎可能擔心索引0將是窗口,除非我錯過了某些東西。 您會必須注意,'$ delegate'中的順序將取決於模塊和指令的定義順序,因此您需要保持這一點一致。您可能還想從列表中刪除不需要的指令('window') - 我仍然傾向於堅持記錄的方式,除非必須,但是如果您必須這樣做非常有用! – Andyrooger

+0

添加'指令'後綴至關重要! – Leon

+0

此舉不再有效, gular 1.4.x只允許在提供者和服務中使用裝飾器。 –

1

decorator方法創建的裝飾器僅適用於服務。他們必須用service,factory,providervalue來創建。請參閱文檔here

如果你想裝飾一個指令,你可以使用相同的名字製作另一個指令。在編譯DOM時將使用這兩個指令,並且您可以使用priority定義編譯順序。

另外,如果你能修改使用您要裝飾指令代碼,那麼你可以只是使使用其模板原來的一個新的指令。

+2

我發現如果包含「指令」作爲名稱的後綴,則可以使用裝飾器指令。因此,在我的例子中,我應該做$ provide.decorator('myDirectiveDirective'... ... – blaster

+3

這是不正確的,請參閱@ blaster的自我回答,它顯示瞭如何修飾指令 – XML