【问题标题】:Stop D3.js from redrawing停止 D3.js 重绘
【发布时间】:2016-05-27 18:12:33
【问题描述】:

我有一个 AngularJS Web 应用程序,它在 ng-repeat 中呈现多个 D3 线图。即使支持数据没有变化,这些图表也会反复重绘。我想禁止所有重绘事件(或尽可能多的)。

重绘不仅仅是随机无限的。当页面上不相关的内容发生变化时,就会触发重绘。支持图表的数据都没有改变,这让我感到困惑。似乎只要 DOM 发生变化,图形就会重绘。

** 编辑(添加代码片段)**

'use strict';

angular.module('alarmAggregator.controllers').controller('HomeCtrl', [
    '$scope',
    '$routeParams',
    '$log',
    'Source',
    'SaveParameters',
    'GetParameters',
    'IncidentSearch',
    'Waveforms',
    'ConfigItems',
    'usSpinnerService',
    'ImageHelper',
    '$http',
    '$timeout',
    function ($scope, $routeParams, $log, source, saveParameters, getParameters, incidentsSearch, waveforms, configItems, usSpinnerService, imageHelper, $http, $timeout) {

searchService.search($scope.parameters).then(function (result) {
   $scope.incidentsList = result.data;
}).finally(function () {
   $timeout(function () {
      $scope.triggerResizeEvent();
      usSpinnerService.stop('search_spinner');
   }, 1);
});
<div ng-repeat="inci in incidentsList track by inci.incidentId">
   <div ng-repeat="dist in inci.disturbances track by dist.uniqueId">
      <div data-ac-chart="'waveform'" data-ac-data="dist.waveforms"></div>
   </div>
</div>

【问题讨论】:

  • 您是否使用 rootScope 来处理数据源?
  • 我正在使用 $scope,我的所有数据都在 $scope 对象的一个​​或另一个属性中。
  • 我几乎是 AngularJS 的新手,只知道如何让自己陷入困境。我很有可能正在使用 rootScope,它只是被称为 $scope。我不知道有什么区别。
  • 你能链接代码库来检查吗?
  • 很可能由于您正在移动鼠标或其他东西而发生摘要循环,从而调用了您的逻辑。您可以找到有关范围和摘要的更多信息here(虽然不是新手级阅读)。

标签: javascript angularjs d3.js


【解决方案1】:

我发现angular-chart.js 设置了一个观察者来观察数据变化。我注释掉了这一行,页面现在快如闪电了。我不确定为什么数据认为它正在更改,但我的图表是静态的,所以没关系。

这是我注释掉的那一行:

scope.$watch('[acChart, acData, acConfig]', init, true);

【讨论】:

  • 如果你使用n3-charts,LineChart.js中注释掉的行是:scope.$watch(getDimensions, debouncedResizeEventEmitter, true);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2020-06-03
  • 2013-10-20
相关资源
最近更新 更多