angular ui 具有多个可扩展级别和合并单元格的网格

angular ui grid with multiple expandable levels and merged cells

我有一个plunker.

我正在使用 angular-ui-grid 和 2 级可扩展行。

  1. 人 - 可扩展
  2. 好友 - 可扩展
  3. 宠物 - 常规

People 级别有这个 expandableRowTemplate

<div ui-grid="row.entity.subGridOptions" ui-grid-expandable  style="height:150px;"></div>

以及这些选项:

$scope.gridOptions = {
  expandableRowTemplate: 'expandableRowTemplate.html',
  expandableRowHeight: 150
}

Friends 关卡有这个 expandableRowTemplate:

<div ui-grid="row.entity.subGridOptions" style="height:150px;"></div>

以及这些选项:

data[i].subGridOptions = {
      columnDefs: [ {name:"Id", field:"id"},{name:"Name", field:"name"} ],
      data: friends,
      expandableRowTemplate: 'expandableRowTemplate2.html',
      rowTemplate: 'rowTemplate.html'
    }

宠物关卡有这样的选项:

friends[j].subGridOptions = {
      columnDefs: [ {name:"Name", field:"name"} ],
      data: friends[j].pets
    }

在好友级别,我希望能够显示包含合并单元格和一段文本的群组名称。有点像 header,但在列表中。该列表将预先排序,因此我可以在需要的地方插入一些组名。 这是通过向该级别添加自定义 rowtemplate(见上文)并像这样测试行的 id(实际上我将测试 属性)来完成的:

<div>
  <div ng-if="row.entity.id !== 0">
    <div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }"  ui-grid-cell></div>
  </div>

  <div ng-if="row.entity.id === 0" >
    <div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
         class="ui-grid-cell" ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }"
         >
    </div>

     <div class="ui-grid-cell-contents">
        <div>
          {{row.entity.name}}
        </div>
      </div>

  </div>
</div>

这种方式在不使用可扩展行的其他示例中工作正常。

使用可扩展行时,我想显示组名的行似乎被渲染了两次,一次是正确的,一次是在行header 单元格中(见下图中的 Rosanne Barret)

我该如何防止这种情况发生?我只希望文本显示一次

在 src 中进行一些调试和挖掘之后。我发现原因是可扩展的网格。网格创建两个容器,一个用于可扩展图标,另一个用于内容。因此,当我们应用数据时,内容会复制到具有可扩展按钮的容器和具有文本的容器中。

解决的唯一方法是使用合并行功能并检查包含这些单元格的容器的 属性,可以通过作用域中的 colContainer 访问。

可扩展按钮单元格的 colContainer 名称为 'left',内容的 colContainer 名称为 'body'。

我对合并行所做的是将合并真实和样本标题添加到数据集中

var friends = data[i].friends;
friends.unshift({
  merge: true,
  title: 'Test',
  bodyTitle: 'Body Title'
});

接下来是修改rowtemplate.html

<div>
   <div ng-if="row.entity.merge && colContainer.name == 'left'">{{row.entity.title}}</div>
   <div ng-if="!row.entity.merge" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }"  ui-grid-cell></div>
</div>

<div>
   <div ng-if="row.entity.merge && colContainer.name == 'body'">{{row.entity.title}}</div>
   <div ng-if="!row.entity.merge" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader }"  ui-grid-cell></div>
</div>

根据要显示的位置选择其中之一 header。我更喜欢 'body',因为可扩展按钮单元的宽度限制。

Plunkr 示例 http://plnkr.co/edit/wGhvtVGwouO01thkx9Z6?p=preview

注意:Plunkr 示例在行模板中同时包含 'left' 和 'body'。以便您可以看到差异。