2016-08-12 49 views
1

在重複的transclude期間,如何通過i而不是#來調用數組?使用下面的代碼,重複會使用陣列中正確數量的項目構建我的列表,但返回的x行數僅爲標記中指定的object[0]。我無法像重複中那樣引用iAngular Transclude issue

我在想這個錯,還是我只是想念一些東西?

我有一個模板,這樣

#### accordion.html #### 
<ion-content scroll="false"> 
<ion-list> 
    <ion-item class="item-stable alertHeader" ng-click="vm.toggleGroup()" ng-class="{active: vm.isGroupActive()}"> 
     <div class="row"> 
      <div class="alertHeaderIcon col-xs-1"> 
       <i class="icon" ng-class="{'icon-watchList':vm.tag == 'Tag1', 'icon-topPerformers':vm.tag == 'Tag2'}"></i> 
      </div> 
      <div class="alertHeaderLabel col-xs-9"> 
       <span class="labelName">{{vm.tag}}</span> 
      </div> 
      <div class="alertHeaderWarning col-xs-1 pull-right"> 
       <span class="label label-pill label-default">7</span> 
      </div> 
      <div class="alertHeaderCaret col-xs-1 pull-right"> 
       <i class="icon" ng-class="vm.isGroupActive() ? 'ion-ios-arrow-down' : 'ion-ios-arrow-forward'"></i> 
      </div> 
     </div> 
    </ion-item> 
    <ion-item class="item-accordion" ng-repeat="i in vm.data" ng-show="vm.isGroupActive()"> 
     <div ng-transclude></div> 
    </ion-item> 
</ion-list> 
</ion-content> 

然後我把這個變成我的標記手風琴如下:

#### alerts.html #### 
<ca-accordion class="accordianTest" tag="'Tag1'" data="vm.itemsA"> 
      <div class="row"> 
       <div class="home-alert-icon col col-10"> 
        <i class="icon" ng-class="{'icon-watchList':vm.itemsA[0].wlName == 'labelA', 'icon-topPerformers':vm.itemsA[0].wlName == 'labelB'}"></i> 
       </div> 
       <div class="home-alert-title col col-70"> 
        {{vm.itemsA[0].wlName}} 
       </div> 
       <div class="home-alert-retailers"> 
        {{vm.itemsA[0].wlRetailers}} 
       </div> 
       <div class="home-alert-metric col col-20"> 
        {{vm.itemsA[0].wlPercent}} 
       </div> 
     </div> 
</ca-accordion> 

回答

1

什麼你缺少的是,transcluded內容,住在一兄弟姐妹的範圍,而不是你的ng-repeat的範圍。 所以你這就是爲什麼i無法到達這裏:

<ca-accordion class="accordianTest" tag="'Tag1'" data="vm.itemsA"> 
      <div class="row"> 
       <div class="home-alert-icon col col-10"> 
        <i class="icon" ng-class="{'icon-watchList':vm.itemsA[0].wlName == 'labelA', 'icon-topPerformers':vm.itemsA[0].wlName == 'labelB'}"></i> 
       </div> 
       <div class="home-alert-title col col-70"> 
        {{vm.itemsA[0].wlName}} 
       </div> 
       <div class="home-alert-retailers"> 
        {{vm.itemsA[0].wlRetailers}} 
       </div> 
       <div class="home-alert-metric col col-20"> 
        {{vm.itemsA[0].wlPercent}} 
       </div> 
     </div> 
</ca-accordion> 

只有vm.itemsA可達。

因此,對於一個可能的解決方法是,外移動整個NG重複,到transcluded內容,

或者自己寫指令,將與範圍transclude,這意味着transcluded內容將生活中你的ng-repeat的範圍。

/** 
    @desc a copy of the ng-transclude implementation, but makes the transcluded content scope 
    to be in the same scope of where the transcludeWithScope was used (ngTransclude behaivor 
    bound it to the parent scope) 
    */ 
function transcludeWithScopeDirective() { 
    return { 
     restrict: 'EAC', 
     bindToController: true, 
     link($scope, $element, $attrs, controller, $transclude) { 
      function ngTranscludeCloneAttachFn(clone) { 
       if (clone.length) { 
        $element.empty(); 
        $element.append(clone); 
       } 
      } 

      // If there is no slot name defined or the slot name is not optional 
      // then transclude the slot 
      var slotName = $attrs.transcludeWithScope || $attrs.ngTranscludeSlot; 
      $transclude($scope, ngTranscludeCloneAttachFn, null, slotName); 
     }, 


    }; 
} 

angular 
    .module('transcludeWithScope', []) 
    .directive('transcludeWithScope', transcludeWithScopeDirective); 

,然後更新您的accordion.html使用transcludeWithScope代替NG-transclude的:

<ion-item class="item-accordion" ng-repeat="i in vm.data" ng-show="vm.isGroupActive()"> 
    <div transclude-with-scope></div> 
</ion-item> 

和您的使用情況: 現在我們可以訪問我,因爲我們transcluded內容家居的範圍我們NG-重複。

<ca-accordion class="accordianTest" tag="'Tag1'" data="vm.itemsA"> 
      <div class="row"> 
       <div class="home-alert-icon col col-10"> 
        <i class="icon" ng-class="{'icon-watchList': i.wlName == 'labelA', 'icon-topPerformers': i.wlName == 'labelB'}"></i> 
       </div> 
       <div class="home-alert-title col col-70"> 
        {{i.wlName}} 
       </div> 
       <div class="home-alert-retailers"> 
        {{i.wlRetailers}} 
       </div> 
       <div class="home-alert-metric col col-20"> 
        {{i.wlPercent}} 
       </div> 
     </div> 
</ca-accordion> 
+0

這工作完美,現在我明白爲什麼我不能夠使用我的我。非常感謝! – ZiNG