Angularjs:从使用 ng-repeat 创建的表中一次仅扩展一个表行

Posted

技术标签:

【中文标题】Angularjs:从使用 ng-repeat 创建的表中一次仅扩展一个表行【英文标题】:Angularjs: Expand only one table row at time from the table created using ng-repeat 【发布时间】:2018-02-06 13:02:42 【问题描述】:

我正在使用具有可扩展行的 ng-repeat 创建一个表。我应该能够一次扩展一个表格行。如果我展开一行,那么之前展开的行应该关闭。 如果需要任何进一步的细节,请告诉我。谢谢。

Plunker

<tbody>
  <tr ng-repeat-start="person in people">
    <td>
      <button ng-if="person.expanded" ng-click="person.expanded = false">-</button>
      <button ng-if="!person.expanded" ng-click="person.expanded = true">+</button>
    </td>
    <td>person.name</td>
    <td>person.gender</td>
  </tr>
  <tr ng-if="person.expanded" ng-repeat-end="">
    <td colspan="3">person.details</td>
  </tr>
</tbody>

【问题讨论】:

请在此处提供我的示例代码plnkr.co/edit/yYq1dt?p=preview 请编辑您的问题并在此处添加您的 plnkr。 【参考方案1】:

您可以编写一个函数来实现这一点。该函数将当前行作为参数,隐藏所有其他行,只启用当前行。

HTML

 <button ng-if="!person.expanded" ng-click="expandSelected(person)">+</button>

JS

  $scope.expandSelected=function(person)
    $scope.people.forEach(function(val)
      val.expanded=false;
    )
    person.expanded=true;

  

打工者:http://plnkr.co/edit/jpMCxzAwdbZYUlRylJPN?p=preview

【讨论】:

为此目的使用.forEach.map 用于将一个数组转换为另一个数组。 我已经更新了答案。 map 将返回一个具有相同值的数组。那么什么时候应该使用 .map? 假设在一个接受用户 ID 数组的删除 API 中,您可以使用 .map 将用户数组 [id: 1, name: 'a', ...] 转换为 [1]【参考方案2】:

根据您的要求,无需遍历整个数组来检查是否打开并关闭了任何其他行。 只需将行号存储为详细信息,然后像这样在您的 tr 中使用它

<tr ng-repeat-start="person in people track by $index">
            <td>
              <button ng-if="rowNumber == $index" ng-click="detailView(-1)">-</button>
              <button ng-if="rowNumber != $index" ng-click="detailView($index)">+</button>
            </td>
            <td>person.name</td>
            <td>person.gender</td>
          </tr>
          <tr ng-if="rowNumber == $index" ng-repeat-end="">
            <td colspan="3">person.details</td>
          </tr>

还有一个功能可以帮助解决这个问题

$scope.detailView = function(index)
    $scope.rowNumber = index
  

【讨论】:

也可以使用对象本身作为指标&lt;button ng-if="selected == person" ng-click="selected = person"&gt;+&lt;/button&gt;

以上是关于Angularjs:从使用 ng-repeat 创建的表中一次仅扩展一个表行的主要内容,如果未能解决你的问题,请参考以下文章

使用 angularjs 和 ng-repeat 从 JSON 数据创建表

Angularjs:从使用 ng-repeat 创建的表中一次仅扩展一个表行

AngularJS 与 MongoDB,从数据库中提取数据,但无法使用 ng-repeat 显示

如何使用 ng-repeat 使 bxSlider 在 AngularJS 中工作?

在 AngularJS1 的一个 ng-repeat 指令中使用多个 limitTo 过滤器

AngularJS 使用控制器中的函数从服务中返回数据以用于 ng-repeat