Javascript AngularJS使用ng repeat在指令中转移范围

Javascript AngularJS使用ng repeat在指令中转移范围,javascript,angularjs,angularjs-directive,angularjs-ng-transclude,Javascript,Angularjs,Angularjs Directive,Angularjs Ng Transclude,我的目标是有一个指令,我给它内容,它会重复X次。就像ng repeat一样,我只想将其包装在其他功能中,例如限制切换和转置内容之外的额外元素 出于某种原因,不管我怎么做,转换都无法访问指令隔离范围 我在链接中使用了transclude函数,但在几个变体中都没有使用。下面是一个演示: 下面是代码的要点: app.directive('repeatContents', function() { return { scope: { items: '=repeatConte

我的目标是有一个指令,我给它内容,它会重复X次。就像ng repeat一样,我只想将其包装在其他功能中,例如限制切换和转置内容之外的额外元素

出于某种原因,不管我怎么做,转换都无法访问指令隔离范围

我在
链接
中使用了
transclude
函数,但在几个变体中都没有使用。下面是一个演示:

下面是代码的要点:

app.directive('repeatContents', function() {
  return {
    scope: {
      items: '=repeatContents',
      limit: '=repeatLimit'
    },
    transclude: true,
    template: '<div ng-repeat="item in items">' +
                  '<em>Outside transclude: {{item}}</em><br />' +
                  '<ng-transclude></ng-transclude>' +
              '</div>',
    link: function(scope, el, attrs, ctrl, transclude) {
      transclude(scope, function(clone, scope) {
        el.append(clone);
      });
    }
  }
});
app.directive('repeatContents',function(){
返回{
范围:{
项目:'=repeatContents',
限制:'=重复限制'
},
是的,
模板:“”+
'外部转置:{{item}}
'+ '' + '', 链接:函数(作用域、el、属性、ctrl、transclude){ 转移(范围、功能)(克隆、范围){ el.追加(克隆); }); } } });

如果您查看plunkr,您将看到外部的transclusion
{{{item}}
可用,但内部不可用。不管
链接
函数的内容是什么,都应该处理它。你知道我能做什么吗?

转移:true
转移内容,同时保留对内容转移范围的引用(在我们的例子中,
重复内容
将在保留对外部范围的引用时转移
未在外部范围中定义,并且您的独立范围定义了
这一事实与外部范围无关

如果您只想转移模板而不保留对其原始范围的引用,则可以使用以下DIACTIVE,而不是
ng transclude

app.directive('customTransclude', function(){
    return {
        link: function(scope, element, attrs, ctrls, transcludeFn){
            if(!transcludeFn){
                throw 'Illegal use of custom-transclude directive! No parent directive that requires transclusion was found';
            }

            transcludeFn(scope, function(clone){
                element.empty().append(clone);
            });
        }
    };
});
然后在
repeat contents
指令的模板中,您可以这样使用它:

<div ng-repeat="item in items">
    <em>Outside transclude: {{item}}</em><br/>
    <custom-transclude></custom-transclude>
</div>

外部转包:{{item}}

我无法让你想要的东西发挥作用……但是,或者,我确实可以在没有transclude的情况下让它发挥作用,只需将另一个指令放入模板中……这是一个plunkr,如果我只有一个用例就可以了,但在我的使用中,我必须为我拥有的每个用例制作一份该指令的副本ch违背了指令的目的,我被抛出错误,或者被告知transcludeFn不是一个函数。@casraf您仍然必须在
repeatContents
指令中使用
transclude:true
。只有将
ng transclude
更改为
custom transclude
。Hee是一个有效的工具。我觉得它更清楚一点当您在上面的工作演示中将repeatContents指令中的“link”去掉时。这说明了实际发生的情况,以及为什么您在最后看到了附加的“Other item:”。