Sto provando a creare un grafico d3 usando una direttiva Angolare. Riesco a crearlo, ma il problema è che voglio degli eventi con ng-clic sugli elementi del grafico e non sono sicuro di come dovrebbe essere fatto.Angolare ng-click all'interno di un grafico d3 creato dinamicamente non funziona
Qui è la mia direttiva:
.directive('circleChart', function($parse, $window, $compile) {
return {
restrict: 'A',
scope: {
datajson: '='
},
link: function(scope, elem, attrs) {
var circleChart = new CircleChart(scope.datajson);
circleChart.initialise(scope);
var svg = circleChart.generateGraph();
svg = angular.element(svg);
console.log(svg);
//scope.$apply(function() {
var content = $compile(svg)(scope);
elem.append(content);
//});
}
}
});
L'oggetto CircleChart crea mia tabella d3 e c'è il posto allego un attributo ng-click agli elementi del grafico (non sembra essere un modo angolare corretta di farlo):
var CircleChart = Class.create({
initialise: function(scope) {
this.datajson = scope.datajson;
},
generateGraph: function() {
.............
var chartContent = d3.select("div#chart-content");
var svg = chartContent.append("svg")
.attr("id", "circle")
.attr("width", diameter)
.attr("height", diameter)
.style("border-radius", "50px")
.append("g")
.attr("transform", "translate(" + diameter/2 + "," + diameter/2 + ")");
...............
var circle = svg.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("class", function(d) {
return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root";
})
.attr("id", function(d) {
return d.id;
})
.attr("value", function(d) {
return d.name
})
.attr("parent", function(d) {
if (d.parent) return d.parent['id']
})
.attr("ng-click", function(d) {
return "getEgs('" + d.id + "')";
})
...............
il codice d3 sta lavorando bene, perché se tolgo il codice di compilazione dalla direttiva, il grafico viene disegnato, ma i NG-click non sparano.
Se lascio il codice di compilazione lì, entra in un ciclo infinito e il browser sta accumulando memoria finché non devo ucciderlo.
Ovviamente, il mio metodo non funziona e sarà impressionante se qualcuno mi può aiutare
Che cos'è il 'svg' nella funzione' generateGraph'? Questo DOM è staccato? Inoltre, a mio parere, non è una buona idea generare modelli angolari dal codice. Il modo in cui lo farei è passare i callback a 'CircleChart' durante l'inizializzazione o durante l'invocazione, catturare l'evento click in d3 e richiamare tale callback tramite codice Javascript. –
@musically_ut Ho aggiornato la mia domanda con il codice di creazione svg. Sto cercando di capire cosa hai detto sul passaggio dei callback. Ti stai riferendo alla funzione reale che voglio chiamare con il ng-click? Posso probabilmente accedervi se utilizzo l'ambito del controller nella mia direttiva. –
Sì, preferisco chiamare la funzione 'getEgs' all'interno di' .on ('click', ...) 'invece di emettere un' ng-click' nel codice. –