0

我試圖跨越ng-repeat循環中的表格行(a),以便當用戶單擊(a)時可以顯示/隱藏另一個表格行(b)。兩個表格行都在渲染,但是,在指令模板中需要包含(a)之前(b)的<ng-transclude>元素正在破壞佈局。我如何使用指令來渲染兩個表格行而不破壞佈局?Angular指令transclude <tr>中斷佈局

//主模板

<tr id="a" campaign-item ng-if="vm.campaignData.length > 0" ng-repeat="campaign in vm.campaignData | orderBy:vm.sortBy:vm.sortReverse | filter:searchCampaigns track by $index" ng-click="vm.showCampaignPreview(campaign)"> 
    <td>{{ campaign.name }}</td> 
    <td>{{ campaign.priority }}</td> 
    <td>{{ campaign.status }}</td> 
    <td>{{ campaign.creator }}</td> 
    <td>{{ campaign.approver }}</td> 
    <td>{{ campaign.release_date }}</td> 
    <td>{{ campaign.expiration_date }}</td> 
    <td><select ng-init="campaignOptions = vm.campaignOptions[0]" name="campaignOption" class="form-control" ng-model="campaignOptions" ng-options="campaign.name for campaign in vm.campaignOptions track by campaign.value"></select></td> 
</tr> 

//指令

(function(){ 
'use strict'; 

angular.module('vsmsCampaignModule') 
.directive('campaignItem', campaign) 

    function campaign(){ 

     var directive = { 
      link: link, 
      restrict: 'EA', 
      transclude: true, 
      templateUrl: 'app/vsms/admin/campaign/campaign.tpl.html' 
     }; 

     return directive; 

     function link(scope, el, attr, ctrl, transclude) { 
      // do something with clone compiled and linked 
      // in child scope of directive's scope: 
     } 

    } 

})(); 

//指令模板

<ng-transclude></ng-transclude> 

<tr id="b"> 
    <td colspan="8">{{ campaign.description }}</td> 
    <td colspan="8"> 
     <div class="row"> 
      <div class="col-lg-1"> 
       <ul> 
        <li ng-repeat="package in campaign.packages"> 
         {{ package.name }} 
        </li> 
       </ul> 
      </div> 
      <div class="col-lg-1">{{ campaign.policy }}</div> 
      <div class="col-lg-1">{{ campaign.region }}</div> 
      <div class="col-lg-1"> 
       <ul> 
        <li ng-repeat="vehicle in campaign.vehicles"> 
         {{ vehicle.name }} 
        </li> 
       </ul> 
      </div> 
     </div> 
    </td> 
</tr> 

//更新,我解決了這個問題,只需使用NG-重複-start/end

<tr ng-class-odd="'odd'" ng-class-even="'even'" ng-if="vm.campaignData.length > 0" ng-repeat-start="campaign in vm.campaignData | orderBy:vm.sortBy:vm.sortReverse | filter:searchCampaigns track by campaign.id" ng-click="vm.showCampaignPreview(campaign)"> 
    <td>{{ campaign.name }}</td> 
    <td>{{ campaign.priority }}</td> 
    <td>{{ campaign.status }}</td> 
    <td>{{ campaign.creator }}</td> 
    <td>{{ campaign.approver }}</td> 
    <td>{{ campaign.release_date }}</td> 
    <td>{{ campaign.expiration_date }}</td> 
    <td> 
     <select ng-init="campaignOptions = vm.campaignOptions[0]" name="campaignOption" class="form-control" ng-model="campaignOptions" ng-options="campaign.name for campaign in vm.campaignOptions track by campaign.value"> 
     </select> 
    </td> 
</tr> 
<tr class="campaign-preview" ng-class-odd="'odd'" ng-class-even="'even'" ng-repeat-end ng-show="vm.selectedCampaign == campaign.id"> 
    <td colspan="8">{{ campaign.description }}</td> 
</tr> 
+0

我強烈懷疑你正試圖呈現另一個'tr'裏面的'tr',這是不合法的HTML。 – frishi

+0

這是無效的HTML ....'

'限制在允許的孩子。你究竟想要做什麼? – charlietfl

+0

我基本上想在tr(b)之前將tr(a)轉換成指令模板,即用tr(a)替換ng-transclude元素。我嘗試使用replace:true,但我得到這個錯誤:「模板的指令'campaignItem'必須只有一個根元素。」 – neridaj

回答

0

我通過簡單地使用ng-repeat-start/end(請參閱上面的更新)而不是指令來解決問題。

0

它會要求你重新考慮你的指令了一點,但你可以使用ng-repeat-startng-repeat-end每各ng-repeat迭代渲染幾個TR S,這樣的:

<tr ng-repeat="vehicle in campaign.vehicles" 
    ng-click='vehicle.showDetails = !!!vehicle.showDetails'> 
    <td> {{ vehicle.name }} </td> 
</tr> 
<tr ng-repeat-end ng-show='vehicle.showDetails'> 
    <td> {{ vehicle.details }} 
    </td>       
</tr>