d3.js - 将 D3 与 Elm 结合使用

标签 d3.js elm

使用端口将 D3 与 Elm 一起使用是否可以管理?我正在尝试 Elm,但找不到任何在没有包装 API 的情况下将 Elm 与 D3 结合使用的示例。我遇到的问题是 wrapper并且前叉不适用于 0.18。我还看到很多声明,建议围绕 javascript API 构建 API 是不好的做法,而您应该使用端口。但是,我在 D3 中找不到任何此类示例。我找到了 this example但是 D3 部分都是用普通的 javascript 完成的,这并不合适。

我可能对与 Elm 立即使用 D3 过于激进,但这确实是我想要用它做的。如果将 D3 与 Elm 一起使用真的不可行,我现在可能不会打扰它。这种交互是否存在根本问题,或者仅仅是 Elm 社区对 D3 缺乏兴趣,还是我只是遗漏了什么?

例如,从上面的 bl.ocks 示例中提取以下代码:

var t = d3.transition().duration(750);
var g = d3.select("svg g")
// JOIN new data with old elements.
var text = g.selectAll("text")
  .data(data, function(d) { return d; });

// ENTER new elements present in new data.
text.enter().append("text")
  .attr("class", "enter")
  .attr("dy", ".35em")
  .attr("y", -60)
  .attr("x", function(d, i) { return i * 24; })
  .style("fill-opacity", 1e-6)
  .text(function(d) { return d; })
  .transition(t)
  .attr("y", 0)
  .style("fill-opacity", 1);

这种事情有没有直接翻译成榆树?

最佳答案

我对 D3 只知道一点点。您将希望将所有数据处理放在 Elm 中,并将数据传递给控制 D3 的 js 代码。这将使您的模型保持理智。

您还需要注意 D3 改变 DOM,因为这样 Elm 将难以更新它负责的页面部分。最好的方法是使用 Elm.embed 将您的页面与 elm 部分和其他部分分开。但是,如果您使用 Html.keyed,您也许可以让 Elm 编写整个页面并让 D3 改变 DOM。帮助 Elm 跟踪 DOM 中的内容。

Html.keyed.div "d3node" 
  [ ]
  [ ... ensure that d3 only touches DOM elements inside this node ... ]

您不能通过端口传递这样的函数,但可以传递 json。所以你可以使用 elm 来创建类似的东西
{ function_type: "f1",
  param1: ... ,
  param2: ...
}

然后你可以在 JavaScript 中做一个
switch (data.function_type) of 
  case "f1: 
    function1 (data.param1, data.param2);
...


function1(p1, p2) {
  // some sort of D3 manipulation
  var text = g.selectAll(p1)
    .data(data, p2);

关于d3.js - 将 D3 与 Elm 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42253601/

相关文章:

javascript - 如何为 Windows 8 和 Android 平板电脑制作 D3js 应用程序的 Web 应用程序

javascript - 通过绑定(bind)新数据来操作元素

javascript - d3 将画笔捕捉到 x 轴上的日期

javascript - 使用包含函数解析 JSON

elm - 何时在Elm中使用类型别名与单值联合类型

elm - GroupBy 使用 Elm 中的记录列表

d3.js - 如何向 d3 图添加抖动?

css - Elm 风格-动感风格元素

elm - 如何部分应用像Basics。+这样的infix函数?

Elm 管理站点的特定部分