你对transclude函数和克隆链接函数做了什么?

从Angular docs指令看,编译函数有3个参数,其中之一是transclude 。 文档提供的唯一解释是:

transclude – 一个transclude连接函数:function(scope,cloneLinkingFn)。

我想知道你在克隆链接函数中究竟做什么。 我什至不知道传入的参数。 我发现一个例子有一个名为clone参数,它看起来像一个HTML元素。 还有其他参数吗? 哪个HTML元素正是这个? 我也在看我的指令中可能使用transclude: 'element' 。 当使用'element'而不是true时候,这些问题的答案是否会改变?

我用简单的例子来理解跨越,但是我不能find更复杂的例子,特别是transclude: 'element' 。 我希望有人能提供一个更全面的解释。 谢谢。

编辑:完全和完全改变我的答案,并标记为“社区维基”(意思是我没有点),因为我是完全错误的,当我回答

正如@Jonah指出的那样,下面是关于指令编译选项和使用 transclusion function的非常好的文章

基本思想是编译函数应该返回一个链接函数。 您可以使用链接函数中提供的transclusion函数来获取transcluded DOM元素的克隆,编译它,然后将其插入到需要插入的位置。

这是一个更好的例子,我已经从Plunker的屁股中抽出来了

编译函数的思想是它给你一个机会,通过在创build和调用链接函数之前传递的属性,以编程方式修改DOM元素。

 // a silly directive to repeat the items of a dictionary object. app.directive('keyValueRepeat', function ($compile){ return { transclude: true, scope: { data: '=', showDebug: '@' }, compile: function(elem, attrs, transclude) { if(attrs.showDebug) { elem.append('<div class="debug">DEBUG ENABLED {{showDebug}}</div>'); } return function(scope, lElem, lAttrs) { var items = []; console.log(lElem); scope.$watch('data', function(data) { // remove old values from the tracking array // (see below) for(var i = items.length; i-- > 0;) { items[i].element.remove(); items[i].scope.$destroy(); items.splice(i,1); } //add new ones for(var key in data) { var val = data[key], childScope = scope.$new(), childElement = angular.element('<div></div>'); // for each item in our repeater, we're going to create it's // own scope and set the key and value properties on it. childScope.key = key; childScope.value = val; // do the transclusion. transclude(childScope, function(clone, innerScope) { //clone is a copy of the transcluded DOM element content. console.log(clone); // Because we're still inside the compile function of the directive, // we can alter the contents of each output item // based on an attribute passed. if(attrs.showDebug) { clone.prepend('<span class="debug">{{key}}: {{value}}</span>'); } //append the transcluded element. childElement.append($compile(clone)(innerScope)); }); // add the objects made to a tracking array. // so we can remove them later when we need to update. items.push({ element: childElement, scope: childScope }); lElem.append(childElement); } }); }; } }; });