同样的意思,$transclude中接收的函数里的参数含有指令元素的内容,而$element包含编译后的DOM元素,所以就可以在控制器中同时操作DOM元素和指令内容,跟上文的compile函数的实现方式有异曲同工之处,这里有几点需要注意,这个控制器应该是指令的控制器,另一个注意到上文除了第一种方法,其他的地方都没有用到ng-transclude,因为无需插入到模板中。
Transclude 和 scope
在开发者指南中提到了a directive isolated scope and transclude scope are siblings,这到底是什么意思呢?假如你认真看前文的例子的话,你就会发现parentController控制器创建了一个作用域,buttonBar指令在parentController下面创建了一个孤立作用域,而根据Angular文档,transclude也创建了另外一个作用域,因此指令的隔离作用域跟transclude作用域是基于同一个父作用域的兄弟作用域。
transclude内容放入元素的属性
实际上,你不可以这么做,但是你可以通过一种变通的方法来实现这种效果
var testapp = angular.module('testapp', []) testapp.directive('tag', function() { return { restrict: 'E', template: '<h1><a href="https://www.jb51.net/{{transcluded_content}}">{{transcluded_content}}</a></h1>', replace: true, transclude: true, compile: function compile(tElement, tAttrs, transclude) { return { pre: function(scope) { transclude(scope, function(clone) { scope.transcluded_content = clone[0].textContent; }); } } } } });
这里没有操作DOM元素,只是把元素的文本内容复制给了作用域属性,然后在通过作用域传给属性。
另外要注意的是,这里的clone参数是jquery或angular.element封装的整个模板元素。
// todo add comparing with ng-include