2016-06-08 103 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