2016-06-08 85 views
0

所以我有一個指令可以是屬性或元素。 當它是一個屬性時,我不想在已聲明的現有元素內加載任何模板。 當它是一個元素時,我想加載給定的模板並填充指令的自定義標籤。Angular指令可選templateUrl

我已經試過:

return { 
    link: function(){...}, 
    templateUrl: function(element, attrs){ 
    url = "path/to/directive/template.html"; 

    // Checking if directive is used as an attribute here 
    if(angular.isDefined(attrs.myDirective)){ 
     url = null; // Tried false, empty string, etc. but angular not happy with any of it 
    } 
    return url; 
    } 
} 

任何想法如何實現這一目標?

回答

0

你有沒有考慮過寫同名的2個指令,並用restrict來指定不同的模板行爲?

function directiveFactory(usesTemplate){ 

    return ['$timeout', function($timeout){ 
     var ddo = { 
      link: function(scope, el,attr){ 
       $timeout(someThing, 1000) 
       //if you dont actually need to use a timeout, might 
       //i suggest scope.$applyAsync if your version of angular supports it? 
      } 
     } 

     if(usesTemplate){ 
      ddo.restrict = 'E'; 
      ddo.templateUrl = 'path/to/template'; 
     } else { 
      ddo.restrict = 'A'; 
     } 

     return ddo; 
    }]; 

} 

module('somename').directive('someName', directiveFactory(true)).directive('someName', directiveFactory(false)); 
+0

不認爲你可以爲2個指令使用相同的名稱。 – charlietfl

+0

@charlietfl:你可以。它非常適合將新行爲附加到現有指令。 (例如記錄每個ng-click激活) – Iain

+0

感謝您的回覆,問題是我在鏈接函數中使用了角度提供程序。這些提供程序在.directive()函數中聲明。 '.directive('myDirective',['$ timeout',function($ timeout){}])''。如果鏈接函數在外面,它會引發錯誤,因爲提供者是未定義的。 – MonsieurNinja