Javascript 用新图表数据更新d3.js Angular指令会导致无限摘要?
我在Angular中有一个d3.js图表指令,它需要更新提供的最新数据。似乎发生的是,Angular在从我的服务器发送新数据时抛出了一个Javascript 用新图表数据更新d3.js Angular指令会导致无限摘要?,javascript,angularjs,d3.js,infinite-loop,Javascript,Angularjs,D3.js,Infinite Loop,我在Angular中有一个d3.js图表指令,它需要更新提供的最新数据。似乎发生的是,Angular在从我的服务器发送新数据时抛出了一个infinite digest错误(为什么?) 指示 指令HTML绑定 我在这里没有看到我的错误,据我所知,除了必要的时候,没有什么应该重新触发摘要。我犯了什么错误?是因为手表被多次调用。你能检查一下它被调用了多少次吗。删除手表会删除无限摘要。。。但是我没有办法更新图表数据。第二个请求,我不知道怎么做。你能在控制台上检查oldvalue和newvalue$wat
infinite digest
错误(为什么?)
指示
指令HTML绑定
我在这里没有看到我的错误,据我所知,除了必要的时候,没有什么应该重新触发摘要。我犯了什么错误?是因为手表被多次调用。你能检查一下它被调用了多少次吗。删除手表会删除无限摘要。。。但是我没有办法更新图表数据。第二个请求,我不知道怎么做。你能在控制台上检查oldvalue和newvalue$watch('data',函数(newvalue,oldvalue)吗更详细地说,通过将第3个参数设置为true,您正在进行深度监视。希望您这样做是有目的的。我看不到任何东西会在这段代码中第一眼看到无限摘要。但是您应该提供
呈现
函数的内容。如果该函数正在更改数据
,这将触发infinite digest.您是否可以在手表中对render()调用进行注释并检查,如果render调用正在更改“data”中的任何属性,它将再次调用手表,并且可能会无限地调用手表,这可能会导致无限摘要问题
(function() {
var app = angular.module('app');
app.directive('chart', ["$window", function($window) {
return {
replace: true,
restrict: 'E',
scope: {
data: '=',
settings: "="
},
link: function($scope, elem, attrs) {
$scope.$watch('data', function(newValue) {
render(newValue);
}, true);
function render(data) {
// complex d3 manipulation here
}
},
templateUrl: '/js/templates/chart.html'
}
}]);
})();
<chart class="dataplot" data="telemetryPlots.altitudeVsTime.data" settings="telemetryPlots.altitudeVsTime.settings" width="100%" height="400px"></chart>
(function() {
var app = angular.module('app', []);
app.controller('myController', ["$scope", "myService", "telemetryPlotCreator", function($scope, myService, telemetryPlotCreator) {
(function() {
missionService.telemetry($scope.slug).then(function(response) {
$scope.telemetryPlots = {
altitudeVsTime: telemetryPlotCreator.altitudeVsTime(response.data)
}
});
})();
}]);
app.service('telemetryPlotCreator', [function() {
this.altitudeVsTime = function(telemetryCollection) {
return {
data: telemetryCollection.filter(function(telemetry) {
return telemetry.altitude != null;
}).map(function(telemetry) {
return { timestamp: telemetry.timestamp, altitude: telemetry.altitude };
}),
settings: {
extrapolate: true,
xAxisKey: 'timestamp',
xAxisTitle: 'Time (T+s)',
yAxisKey: 'altitude',
yAxisTitle: 'Altitude (km)',
chartTitle: 'Altitude vs. Time',
yAxisFormatter: function(d) {
return d / 1000;
}
}
}
};
}]);
app.service('myService', ["$http", function($http) {
// http service
}]);
})();