2015-05-01 49 views
3

我有幾個使用相同鏈接函數的指令。 (鏈接功能取決於使用情況增加了一些額外的狀態和HTML)。所以我宣佈這個如下:當鏈接功能需要$compile在跨多個指令共享的鏈接函數中添加角度依賴

function common_linkfunc(){...} 

var Directive_1 = function($scope, etc) { 
    return {restrict:"E", ... 
      link: common_linkfunc, 
      controller: function($scope, etc) {...} 
    }; 
} 
Directive_1.$injects = ["$scope", "etc"]; 
angular.module("module").directive("D1", Directive_1)...; 

第一個變化是。接下來,我需要添加$templateCache,我的問題是我怎樣才能系統地做到這一點?

我的第一種方法是重寫common_linkfunc作爲

function foo($compile, $templateCache) { 
    return common_linkfunc($compile, $templateCache) {...} 
} 

,然後在每一個指令的使用:

... 鏈接:FOO($編譯,$ templateCache), ...

但這是複製粘貼!有沒有更容易和更容易出錯的方法來做同樣的事情?

回答

2

無論解決方案如何,您都需要將一些參數傳遞給您的常用鏈接函數,因爲Angular不會爲您注入任何內容。話雖這麼說,我能想到的兩種不同的方法:

1)使用arguments

app.directive('foo', function($http, $timeout) { 
    return { 
    restrict: 'E', 
    link: linkFn1.apply(null, arguments) 
    } 
}); 

function linkFn1($http, $timeout) { 
    return function(scope, element, attrs) { 
    // ... 
    }; 
} 

這裏的缺點是,在指導作用事項參數的順序。如果其他指令使用不同的順序,代碼將無法正常工作。

2)使用$injector

app.directive('bar', function($injector) { 
    return { 
    restrict: 'E', 
    link: linkFn2($injector) 
    } 
}); 

function linkFn2($injector) { 
    var $http = $injector.get('$http'), 
     $timeout = $injector.get('$timeout'); 

    return function(scope, element, attrs) { 
    // ... 
    }; 
} 

Working Plunker

+0

感謝 - 只是學到新的東西!我認爲'$注射器'更靈活,更容易適應不斷變化的需求。 – Dinesh