【问题标题】:AngularJS: Remove $watch from ng-repeatAngularJS:从 ng-repeat 中删除 $watch
【发布时间】:2015-11-05 15:34:28
【问题描述】:

我创建了一个报告,它使用一组嵌套的 ng-repeat 指令来创建一个巨大的表格。它可以很好地构建表格,但在那之后,滚动性能受到很大影响 - 我认为这是由于 ng-repeats 创建的大量手表。

报表只需构建一次,然后是静态的。我不需要一直看数据。

我有两个问题:

A) 是否可以查看 Angular 当前正在查看的所有变量的列表?

编辑:This post 对学习如何进行基准测试很有帮助

B) 有没有办法告诉 Angular 停止它正在做的所有手表?我看过很多关于取消自己设置的手表的帖子,但这些都是本地指令,我不知道如何利用它们。

我的偏好是有一个变量,我可以说“如果是真的,那么做所有的手表,如果不是,那么就不要看”或一个只说“开始手表”和“停止手表”的函数。

我已经设置了一个非常好的 DOM 监视服务,它可以知道所有 ng-repeats 何时执行,所以我可以知道我什么时候想停止观看。

这是表本身。除了 tk-ng-repeat-completed 之外,其他“tk-”属性仅用于数据,实际上并不是指令。

<div class="table-responsive">

    <table tk-sticky-column id="records" class="table table-striped table-hover table-condensed">

        <!-- tbody[n] -->
        <tbody class="dataset" ng-repeat="dataset in report.data track by $index" tk-ng-repeat-completed>
            <!-- row[0] -->
            <tr class="headline">
                <!-- header[0] label -->
                <th class="headline" style="background-color:#042E34;">
                    <div style="width:200px;"><h4>{{report.labels.y[$index]}}</h4></div>
                </th>
                <!-- header[n] label -->
                <th ng-repeat="x_label in report.labels.x" tk-ng-repeat-completed
                    class="datapoint date"
                    tk-raw-data="{{x_label}}">
                    <em><small>{{x_label}}</small></em></th>
                <!-- header[last] space for addition @todo remove this, add during calculations -->
                <th class="date"></th>  
            </tr>
            <!-- row[n] -->
            <tr ng-repeat="(key, datapoints) in dataset" tk-metric-key="{{key}}">
                <!-- column[0] label -->
                <td tk-metric-key="{{key}}" 
                    tk-calc="{{report.labels.data[key].calc}}"
                    class="rowdesc begin">{{key}}</td>
                <!-- column[n] data -->
                <td ng-repeat="datapoint in datapoints track by $index" tk-ng-repeat-completed
                    ypos="{{$parent.$parent.$parent.$index}}" xpos="{{$index}}" tk-metric-key="{{key}}"
                    class="datapoint"
                    tk-raw-data="{{datapoint}}">
                        {{datapoint}}</td>
            </tr>

        </tbody>

    </table>

</div>

【问题讨论】:

  • 它可以是 90 x 300。这看起来不像是一张巨大的桌子,但仍然慢了很多。
  • 我见过比那个大得多的表,也许还有其他事情发生。你能把你的一些代码放进去吗?
  • 我不愿发布所有内容,因为有很多内容会丢失。很多格式和类似的东西。肯定有很多事情发生。我想如果我的问题的 A 部分有答案,那将有助于我对事物进行基准测试。
  • @MathewBerg 我添加了表格,我不确定这是否会表明什么。

标签: javascript angularjs watch


【解决方案1】:

如果您使用的版本大于或等于该版本,我建议您查看他们在 1.3 中引入的单绑定语法。它工作得非常好,实现起来非常简单。这是一个例子:

普通语法,为每个变量创建一个观察者:

<div ng-repeat="foo in vm.bar">
  {{foo}}
</div>

单绑定语法,重复内的嵌套变量没有观察者:

<div ng-repeat="foo in vm.bar">
  {{::foo}}
</div>

编辑:

我忘了提到,如果您的数据在第一次填充后根本不会改变(例如,来自 $http.get),您也可以只使用顶层的单绑定语法重复:

<div ng-repeat="foo in ::vm.bar">
  {{::foo}}
</div>

【讨论】:

  • 这是否有助于您解决 $watch 问题@dgig?我希望如此!
  • 嗯,这是一个很好的建议,但它并没有完全解决我的问题,因为我需要一种方法来启动和停止手表。但是对于设置单个手表来说,这很棒,这就是为什么你得到这么多赞成票的原因。感谢您的帮助!
  • 这是旧的,但我重新审视了这个应用所有内容 - 包括“编辑”包含 - 帮助很大,将加载时间减少了约 40%。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2015-11-29
  • 2017-12-22
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多