Sto cercando di integrare d3 e angular2 alpha.37 (avviato da here). Il problema che sto avendo attualmente è che gli elementi DOM generati non ottengono gli attributi utilizzati nell'incapsulamento della vista dello stile emulato, e quindi non posso modificarli senza impostare l'incapsulamento della vista per l'elemento su Nessuno (o Nativo, ma io preferirei usare emulato).Aggiunta dell'attributo host agli elementi DOM generati
sono riuscito a estrarre programmazione L'attributo richiesto da un elemento all'interno del componente [1], e quindi aggiungere agli elementi generati [2], che funziona, ma questo è chiaramente incredibilmente 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);
}
}
Esiste un modo consigliato per gestire questo tipo di cose (o dovrei smettere di armeggiare con il DOM al di fuori di Angular2)?
Se si desidera una risposta, è necessario almeno eseguire l'aggiornamento a beta.0, almeno. –
@EricMartinez Lo stesso problema su beta.7. –