我正在为Angular开发基于UI和排版的指令。在这种情况下,该指令所应用的元素是未知的-从div,span,h1到h5的任何值。
使用模板的原因是我可以ng-*向其中添加指令(因此开发人员无需记住指令名称即可)。
ng-*
我添加属性和重新编译元素的成功有限。ng- transclude但是,添加时没有成功。创建新元素并替换旧元素会带来集成问题(忽略元素上可能存在的其他指令和数据属性),复制这些属性并将其添加到新元素的效果很小。
ng- transclude
这看起来应该真的很简单,因为template它本身可以将元素更改为您指定的任何内容(使用transclude和replace),肯定有“很长的路要走”吗?
template
transclude
replace
太糟糕了,您不能执行以下操作:
module.directive( 'myDir', [ '$window', function( $window ) { return { restrict: "A", controller: function( $scope, $element ) { $scope.tag = $element[0].nodeName; } template: "<{{tag}} data-ng-transclude ng-*=''></{{tag}}>", transclude: true, replace: true, link: function ( scope, element, attrs ) { } } }]);
我认为主要的问题是我希望用模板替换和包含元素,而不是将模板(或编译元素)作为子元素添加。
从那以后ng-*,我在代码中用香草JS 替换了对和模板的需要,例如:
<div data-ng-style="{'font-size':fontSize}></div>
与
element[0].style.fontSize = scope.fontSize;
哪个引起了使用许多ng-*指令的好处的问题?只是“成角度的方式”吗?
我已经考虑了这个问题几周了,直到我意识到这template可能是具有访问element和调用能力的函数attrs。因此,我能够返回带有现有元素标签的模板。
element
attrs
module.directive( 'myDir', [ '$window', function( $window ) { return { restrict: "A", template: function( element, attrs ) { var tag = element[0].nodeName; return "<"+tag+" data-ng-transclude ng-*=''></"+tag+">"; }, transclude: true, replace: true, link: function ( scope, element, attrs ) { } } }]);
<div data-my-dir> <span>some other stuff</span> <div>more stuff</div> </div> <span data-my-dir></span> <h1 data-my-dir></h1>
<div ng-*="" data-ng-transclude="" data-my-dir=""> <span class="ng-scope">some other stuff</span> <div class="ng-scope">more stuff</div> </div> <span ng-*="" data-ng-transclude="" data-my-dir=""></span> <h1 ng-*="" data-ng-transclude="" data-my-dir=""></h1>