Esiste anche la possibilità di inserire i AngularJS gestiscono sintassi bar direttamente nella d3 elementi generato:
var containerDiv = d3.select(targetCSSSelectorForADiv);
var svgG = containerDiv
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
svgG.selectAll(".tempclass").data(scope.circles).enter()
.append("circle")
.attr("class", "tempclass")
.attr("cx", function (d, i) { return "{{circles[" + i + "].cx}}" })
.attr("cy", function (d, i) { return "{{circles[" + i + "].cy}}" })
.attr("r", function (d, i) { return "{{circles[" + i + "].radius}}" })
.attr("ng-style", function (d, i)
{
return "{fill: circles[" + i + "].circolor"
+ ", opacity: circles[" + i + "].opa"
+ ", 'stroke-width': 4*circles[" + i + "].opa"
+ ", stroke: 'red' }";
});
prega di notare le seguenti cose: lo scopo è in effetti la portata angolare oggetto passato dalla direttiva alla funzione di rendering. Impostare lo stile di un elemento su un'espressione "{{...}}" non funzionerà quindi sto usando l'attributo "ng-style" qui.
Tuttavia c'è un altro trucco: Dovete dire angolare di guardare ai elementi DOM generate dinamicamente e vincolante filo il backup dei dati, ora so di due modi per farlo:
//the target div is the one with the angular ng-controller attribute
//this you can call at the end of the d3 rendering call from within the render function
angular.bootstrap(document.getElementById("d3ContainerDivID"), ['d3App']);
l'altra modo è questo:
//and this could be called from the directive that triggered the rendering or
//some other place that could have the angular $compile service injected
$compile(document.getElementById("d3ContainerDivID"))(scope);
Ora è possibile modificare i vostri membri portata e saranno direttamente aggiornato per gli elementi D3, in questo caso i cerchi SVG. Nel controller angolare (che viene istanziato prima che la direttiva firmi che disegna gli oggetti d3).
$scope.circles = [];
for (var i = 0; i < 50; i++)
{
$scope.circles.push(new Circle());
}
setInterval(function()
{
$scope.circles.forEach(function (d, i) { $scope.circles[i] = new Circle(); });
$scope.$digest();
}, 2000);
Si prega di notare la chiamata $ digest, che dice all'angolo di digerire l'ambito modificato; questo cambierà i valori sugli elementi del cerchio svg. Per qualcosa come le animazioni e simili, d3 non è più responsabile e si dovrebbe implementare manualmente o utilizzare un modello diverso.
Questo è molto utile, grazie per la condivisione :) – gouravtiwari21
Qui si trova un altro articolo come integrare D3 in angolare http://goo.gl/KYBFnX e un progetto GitHub Seed http://goo.gl/CS97f2 –