【问题标题】:D3 force simulation in AngularAngular 中的 D3 力模拟
【发布时间】:2020-02-17 11:58:24
【问题描述】:

我正在尝试在 Angular 应用程序中进行 d3 力模拟。基本上我所拥有的是run 方法,用于初始化和设置模拟选项,ticked 方法在每个刻度上更新模拟。我有几个与此相关的问题。 (JavaScript 版本的代码运行良好)

我的初始代码是

private run() {
  this.simulation = d3.forceSimulation()
  //some code
  this.simulation.on('tick', this.ticked())
}

private ticked() {
  //code
}

这不起作用(模拟不打勾)。但是,如果我像下面这样内联 ticked 方法,它会起作用并且模拟会继续。

private run() {
  this.simulation = d3.forceSimulation()
  //some code
  this.simulation.on('tick', () => {
   //code
  })
}

这有什么具体原因吗?我是 Angular 和 d3 的新手,它可能很简单,就像 JavaScript 的行为方式一样。

第二个问题,之前的代码 sn-p(第二个)工作了几秒钟,然后模拟冻结。控制台中没有错误消息。你能猜到为什么会这样吗? 我希望这足够详细。如果需要,我可以添加更多详细信息。

【问题讨论】:

  • this.ticked() 将立即执行函数,表达式将计算为函数的返回值。你想传递函数本身,而不是:this.simulation.on('tick', this.ticked)(不是缺少的括号),它基本上等同于已经工作的内联版本。
  • 是的,这是有道理的。感谢您缺少括号位。很简单,现在问这个问题我觉得很愚蠢。您知道为什么模拟会在一段时间后停止。

标签: javascript angular d3.js


【解决方案1】:

您所做的第一次尝试是将返回值从您的方法 'ticked' 传递给事件函数。

事件“on”接收两个参数,第一个是您要绑定的事件,在本例中为“tick”,以及一个在事件返回值时执行的回调函数。您传递的第二个参数是一个值,而不是回调函数。所以它在事件触发之前执行了你的函数。

您可以像这样使用带有回调的函数“打勾”:

this.simulation.on('tick', () => this.ticked());

【讨论】:

  • 这是有道理的。您知道为什么模拟会在一段时间后停止。
  • 我以前从未使用过 D3,但我发现此链接可能会回答您的问题:stackoverflow.com/questions/28745398/…
  • 感谢@Matheus,这个问题没有直接关系,但有助于理解正在发生的事情。我有一些线索为什么它会在一段时间后停止。我将尝试进一步调查。如果我没有得到进一步的答案,我将在明天将其标记为正确答案。
猜你喜欢
  • 2018-10-19
  • 2017-02-25
  • 2022-01-14
  • 2014-02-27
  • 1970-01-01
  • 2013-04-13
  • 2019-06-18
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多