【问题标题】:AngularJS: add/destroy detail table rowAngularJS:添加/销毁明细表行
【发布时间】:2016-07-28 13:06:49
【问题描述】:

我有一个 Angular 1.4.12 应用程序,其中包含一个使用嵌套 ng-repeat 创建的表,其中显示一组数据。

<tr ng-repeat-start="item in pmt.table.data">
  ...main data...
</tr>
<tr class="table-details" ng-repeat-end="item in pmt.table.data">
    <td colspan="15">
      <div uib-collapse="!item.showDetails">
         <div class="table-details-content">hello world</div>
      </div>
     </td>
</tr>

每一行都有一个披露图标,用于显示包含详细信息的附加行。

过去,我们已经加载了所有数据并使用 Angular UI Bootstrap 的“折叠”指令来隐藏和显示详细信息行。

您可以在这支 Pen 中看到全部内容:https://codepen.io/smlombardi/pen/kXpqPJ?editors=1010

当记录集有大量数据时,这种方法的问题就很明显了;比如1000行的json数据。尽管使用了单向绑定,但性能太慢了。

我宁愿做的是完全不包含详细信息行,然后在单击披露图标时,动态创建行和根据父行 ID 获取其数据。当披露图标关闭时,销毁详细信息行。

我用 jQuery 做过类似的事情,但我对如何使用 Angular 有点迷茫。

【问题讨论】:

  • 你试过什么?首先,您需要一个服务客户端来检索给定 ID 的详细信息,然后其他一切都将是接口工作。你坚持哪一个?
  • 使用 ng-if 来决定不消化哪些行

标签: javascript jquery angularjs angularjs-ng-repeat


【解决方案1】:

使用 ng-if。

ngIf 指令根据 {expression} 删除或重新创建 DOM 树的一部分。如果分配给 ngIf 的表达式的计算结果为 false 值,则从 DOM 中删除该元素,否则将该元素的克隆重新插入 DOM。

请注意,ng-if 完全创建(并销毁)一个新范围 - 这是您想要的,但如果您再次需要数据绑定,您需要特别注意您的范围继承。

      <td colspan="15">
        <!--Change uib-collapse to ng-if-->
        <div ng-if="item.showDetails">
          <div class="table-details-content">hello world</div>
        </div>
      </td>

工作Codepen

【讨论】:

  • 这是比 uib-collapse 方法更好的解决方案。但是,对于 1000 行,加载性能仍然太慢。时间线中的脚本部分,即使是本地数据也超过 5 秒。
  • 我明白了。目前,ng-if 是最接近的解决方案,您可以在其中动态创建和销毁 DOM 元素。太糟糕了,它对你来说仍然滞后:(也许你应该转移到 ng2,他们声称它至少快 4 倍 :D 无论如何,浏览器上的整体最佳观察者数量将在 2k 左右,也许你可以看看其他地方看看你的代码是否可以进一步优化?
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多