5

我有一个轮播指令,其中包括一些分块,以将传入的数组映射items到元素结构数组的数组中,然后生成类似于下面的伪代码的标记:

<array of arrays>

  <array of items>
    <item>
    <item>
  </array of items>

  <array of items>
    <item>
    <item>
  </array of items>

</array of arrays>

这个的角度模板看起来像这样:

<div class="carousel__content" ng-style="carousel.containerWidth">
  <ul class="carousel__chunk" ng-repeat="chunk in carousel.chunks" ng-style="carousel.chunkWidth">
    <li class="carousel__item" ng-repeat="item in chunk" ng-style="carousel.itemWidth">
      <div class="carousel__item-content">

        [element should be transcluded into this spot.]

      </div>
    </li>
  </ul>
</div>

鉴于我的视图代码:

<!-- The <a> tag should appear inside the 'carousel.html' template's ng-repeat list. -->
<carousel items="items" config="config">
  <a href="#">{{ item.name }}</a>
</carousel>

我希望嵌入的元素绑定到item最深的对象ng-repeat

此处提供了带有简化测试用例的完整 Plunker:http: //plnkr.co/edit/kYItcXV0k9KvnpiYx1iG

问题是我无法将ng-transclude属性放入ng-repeat并且(如carousel.jsPlunkr 中的指令文件所示)我似乎无法使用步骤中的transclude()函数将要嵌入的标记手动注入该位置compile指示。

任何想法将不胜感激。

4

1 回答 1

6

在现有指令的链接函数中设置一个引用 transclude 函数的变量:

 post: function($scope, $element, attrs) {
     $scope.transclude = transclude; 
     ...

然后,创建一个新指令来代替ng-transclude您希望嵌入内容出现在其中的元素:

.directive('innerTransclude', function(){
  return function(scope, elem, attrs){
    scope.transclude(scope, function(clone){
      elem.append(clone);
    });
  }
})

该指令只是将克隆附加到元素,同时避免尝试在使用嵌入的元素内部使用嵌入的问题。不要忘记将其添加到您的模板中:

<div class="carousel__item-content" inner-transclude></div>

演示

于 2014-06-05T03:11:51.500 回答