Ich versuche, d3 und angular2 alpha.37 zu integrieren (gestartet von here). Das Problem, das ich momentan habe, ist, dass die generierten DOM-Elemente nicht die Attribute erhalten, die in der emulierten Verkapselung der Stilansicht verwendet werden. Daher kann ich sie nicht stylen, ohne die Verkapselung der Ansicht für das Element auf None (oder Native) zu setzen würde eher emuliert verwenden).Host-Attribut zu generierten DOM-Elementen hinzufügen
konnte ich das gewünschte Attribut aus einem Element in der Komponente programmatisch extrahieren [1], und dann auf die erzeugten Elemente hinzufügen [2], die Arbeit macht, aber das ist eindeutig unglaublich Hacky:
import {Component, View, Attribute, ElementRef, LifecycleEvent} from 'angular2/angular2';
import d3 from 'd3';
@Component({
selector: 'bar-graph',
properties: [ 'data' ]
})
@View({
template: '<div class="chart"></div>',
styles: [`.chart {
background: #eee;
padding: 3px;
}
div.bar {
width: 0;
transition: all 1s ease-out;
-moz-transition: all 1s ease-out;
-webkit-transition: all 1s ease-out;
}
div.bar {
font: 10px sans-serif;
background-color: steelblue;
text-align: right;
padding: 3px;
margin: 5px;
color: white;
box-shadow: 2px 2px 2px #666;
}`]
})
export class BarGraph implements LifecycleEvent.OnChanges {
data: Array<number>;
divs: any;
constructor(elementRef: ElementRef, @Attribute('width') width: string, @Attribute('height') height: string) {
var el:any = elementRef.nativeElement;
var graph:any = d3.select(el);
this.hostAttr = graph[0][0].children[0].attributes[1].name; //hack here [1]
this.divs = graph.
select('div.chart').
style({
'width': width + 'px',
'height': height + 'px',
}).
selectAll('div.bar');
}
render(newValue) {
if (!newValue) return;
this.divs.data(newValue)
.enter().append('div')
.classed('bar', true)
.attr(this.hostAttr, true) //add the attribute here [2]
.style('width', d => d + '%')
.text(d => d + '%');
}
onChanges() {
this.render(this.data);
}
}
Gibt es einen empfohlenen Weg, mit dieser Art von Dingen umzugehen (oder sollte ich aufhören, mit dem DOM außerhalb von Angular2 zu basteln)?
Wenn Sie eine Antwort wollen, müssen Sie mindestens auf Beta.0 mindestens aktualisieren. –
@EricMartinez Das gleiche Problem auf beta.7. –