Tôi đang cố tích hợp d3 và angular2 alpha.37 (bắt đầu từ here). Vấn đề tôi hiện đang gặp là các phần tử DOM được tạo không nhận các thuộc tính được sử dụng trong gói đóng gói kiểu dáng được mô phỏng và vì vậy tôi không thể tạo kiểu cho chúng mà không đặt đóng gói khung nhìn cho thành phần thành Không (hoặc Gốc, nhưng tôi thay vì sử dụng mô phỏng).Thêm thuộc tính máy chủ vào các phần tử DOM được tạo
tôi quản lý để lập trình trích xuất các thuộc tính cần thiết từ một yếu tố bên trong phần [1], và sau đó thêm nó vào các yếu tố tạo ra [2], mà không làm việc, nhưng điều này rõ ràng là vô cùng 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);
}
}
Có cách nào được khuyến nghị để xử lý loại điều này (hoặc tôi nên dừng tinkering với DOM bên ngoài Angular2)?
Nếu bạn muốn có câu trả lời, ít nhất bạn cũng sẽ phải nâng cấp lên beta.0. –
@EricMartinez Cùng một vấn đề trên phiên bản beta.7. –