Ich habe eine Direktive, die ein C3js-Diagramm generiert. Ich habe ein Objekt, das verschiedene C3-Eigenschaften enthält. Wenn das eingehende Element bereits ein Objekt chartOptions
hat, wird es verwendet, wenn nicht, wird das Standardobjekt hinzugefügt.Endlosschleife beim Beobachten des Elternobjekts, Watcher aktualisiert keinen Wert
scope.elementObject.chartOptions = scope.elementObject.chartOptions || chartOptions;
ich für alle Änderungen auf dem chartOptions
Objekt zu sehen bin versucht, weil es mit außerhalb der Richtlinie in Wechselwirkung wird jedoch einfach einen Beobachter zu schaffen, ohne irgendeine Funktionalität Hinzufügen führt zu einer Endlosschleife. Keine der regulären Endlosschleifen-Lösungen scheint zu funktionieren, weil ich scheinbar das Objekt im Beobachter nicht modifiziere.
scope.$watch('elementObject.chartOptions', function() {
console.log('changed')
}, true);
//INFINITE LOOP
Wenn ich aber ein Kind Objekt beobachte, dann komme ich nicht in eine Endlosschleife, wie
scope.$watch('elementObject.chartOptions.data', function() {
console.log('changed')
}, true);
//NO INFINITE LOOP
Richtlinie
app.directive('newchart', function() {
return {
scope: {
data: "=",
elementObject: "=element"
},
restrict: 'E',
link: link
};
function link(scope, elem) {
var el = elem[0];
var chartOptions = {
data: {
columns: [['data1', 30, 200, 100, 400, 150, 250]],
type: 'spline',
labels: false
},
interaction: { enabled: true },
grid: { x: { show: false }, y: { show: false } },
legend: { show: true, position: 'bottom' },
tooltip: { show: true, grouped: true }
};
scope.elementObject.chartOptions = scope.elementObject.chartOptions || chartOptions;
scope.elementObject.chartOptions.bindto = el;
var chart = c3.generate(scope.elementObject.chartOptions);
scope.$watch('elementObject.chartOptions', function() {
console.log('changed')
}, true);
};
});
Ich muß in der Lage sein, auf Änderungen an einer der Eigenschaften des Objekts chartOptions
nicht nur auf Daten zu achten, wie im obigen Beispiel.
Warum nicht sie mit dieser Anweisung AngularJS http://jettro.github.io/c3-angular-directive/ –
ich habe gesehen, dass vor, aber es schien nicht ganz zu passen meine Bedürfnisse. Ich baue ein Dashboard auf dem gridster mit vielen beweglichen Teilen und es war einfacher, meine eigene Direktive zu erstellen, bis dieses Problem auftauchte. –