更新图表时,arcTween圆环过渡在角度4中不起作用

时间:2017-05-12 18:45:15

标签: javascript angular typescript d3.js

这是我的更新方法,它将新数据作为输入

public updateChart(mockData?: any) {
this.path.data(this.pie(this.dataset))
.transition()
.duration(750)
.attrTween('d', <any> this.arcTween);}`

这是我的arcTween方法:

public arcTween(a: any): any {
let i = d3.interpolate(this.current, a);
this.current = i(0);
  return function (t) {
    return this.arc(i(t));
  };
}

调用上面指定的方法时出现问题: core.es5.js:1084 ERROR TypeError:无法设置未定义的属性'arc'

仔细检查表明,“这个”也是未定义的。

我该如何解决这个问题?似乎d3.js不适合角4:S

我尝试了很多变通办法,但一切都会导致此错误

2 个答案:

答案 0 :(得分:0)

我认为你有一个范围问题,你可以解决这个问题:

public arcTween(a: any): any {
    let i = d3.interpolate(this.current, a);
    let that = this;
    this.current = i(0);
    return function (t) {
        return that.arc(i(t));
    };
}

答案 1 :(得分:0)

如果在像这样的内部函数中使用,

string input = "1h 0m"; string[] formats = { @"m\m", @"h\h\ m\m" }; TimeSpan ts; TimeSpan.TryParseExact(input, formats, null, out ts); 就会超出范围 - 它会丢失上下文。一个修复是 s.alem 如何更改代码以添加this然后在函数内使用let that = this; - that将继续保持值that。尝试修复它的另一种方法是将其转换为箭头函数:

(伪代码,我没有试过这个,但你会得到这个想法)

this

另一种方法是,如果这是在对象上编写的方法,则可以通过该对象调用它。因此,如果public arcTween(a: any): any { let i = d3.interpolate(this.current, a); this.current = i(0); return t() => { return this.arc(i(t)); //this will be as expected }; } arcTween对象上的方法,则可以使用

调用它
animation

它会保持animation.arcTween() 完好无损。

希望其中一个修复范围问题。