【发布时间】:2018-03-06 11:38:54
【问题描述】:
Tldr;当 Angular 将 this 绑定到类(组件/服务)时,如何处理引用 D3 对象的 this?
我希望在 Angular (v.4) 应用程序中使用 D3.js (v.4)。
我的代码在独立的 JavaScript 中工作,但我现在需要将它集成到 Angular 应用程序中。
this 的使用让我大吃一惊。
我有一个想要拖动的 SVG 组,所以我使用 .call(drag)
someFunction() {
this.unitGroup = this.svg.append('g')
.attr('id', 'unitGroup');
.call(drag)
}
当我尝试引用被拖动的 svg 元素时,我的问题就出现了。在我的原始代码中,我可以参考this,例如let matrix = this.getCTM()。在服务中使用此代码时,现在无法使用 this。
drag = d3.drag()
.on('start', () => {
this.setClickOrigin(d3.event);
})
.on('drag', (d) => {
const m = this.getCTM(); // <--- PROBLEM HERE
const x = d3.event.x - this.clickOrigin.x;
const y = d3.event.y - this.clickOrigin.y;
this.setClickOrigin(d3.event);
d3.select(this) // <--- PROBLEM HERE
.attr('transform', `matrix(${m.a},${m.b},${m.c},${m.d},${m.e + x},${m.f + y})`);
});
任何关于如何实现这一点或澄清我做错了什么的指针将不胜感激。
我认为这不仅仅是与箭头函数 this 绑定相关的错误,因为 .on('drag', function(d){...} 会导致相同的错误。
这是 Plunker 说明我的问题:https://embed.plnkr.co/p1hdhMBnaebVPB6EuDdj/
【问题讨论】:
-
改成 on('drag', function (d) { ... } ) 并不能解决问题。
-
你能在 plunker 中重现它吗?您可以尝试将
this更改为drag,例如d3.select(drag)或者您正在寻找d3.event.currentTarget而不是this -
我会看看这样做的。由于需要大量代码,我起初犹豫不决,我希望有人能认出我的错误。
-
我想在 plunker 中看到它)这是我的 d3 示例 plnkr.co/edit/qM3qrk3swvalQFBh1Db1?p=preview
标签: javascript angular d3.js svg