【问题标题】:Distributed json loading in force collapsable layout强制可折叠布局中的分布式 json 加载
【发布时间】:2013-07-31 05:35:04
【问题描述】:

我对 D3 很陌生,非常感谢一些帮助。我正在尝试修改此强制可折叠布局

https://bitbucket.org/kolbyjAFK/d3/src/f87f85b9c6e2/examples/force/force-collapsible.html

它加载的数据在单个 json 文件中 https://bitbucket.org/kolbyjAFK/d3/src/f87f85b9c6e236f20dec8151ae11438950aaf967/examples/data/flare.json?at=fix-interpolate-hsl

但是,如果我有一个不想立即加载的数据怎么办。我只想在用户单击特定节点时调用子节点。

所以我基本上想将 json 模块化,以便在单击节点时,动态加载包含子数组的 json 文件。

我需要这样做,因为我的数据很大,有 500k 叶节点。

我怎样才能进行这种动态加载?

【问题讨论】:

  • 您能否详细说明该方法。我是第一次使用 d3。
  • 好吧,我的数据太大了,可以一次加载。我想调用不同的文件。隐藏和显示已经实现。但我无法理解我将如何修改bitbucket.org/kolbyjAFK/d3/src/f87f85b9c6e2/examples/force/… 中的更新函数,因为我认为这个更新函数考虑到我们一次加载整个树。
  • 这正是我要寻找的内容:当我点击一个节点时。包含其节点的 json 被加载。 我可以这样做,但我不知道我应该如何将这些节点链接到它的父节点。请对此提供帮助
  • 好吧,如果你使用d3.json,它会创建一个JSON对象供你使用。我怀疑正确的方法是在单击节点时将该对象附加到父节点中的 children 数组中。如果您的结构中的每个节点都有一个filename: _value_ 对象,您可以将它用作onclick 的参数,从您通过d3.json 函数传递的文件名创建child 对象,然后在onclick 函数中,将您创建的child 对象附加到您单击的节点的children 数组中。

标签: javascript json d3.js


【解决方案1】:

为了帮助您入门,您代码中的 click 函数是解决此问题的关键。

现在看起来像这样:

function click(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
  update();
}

这仅通过在两个不同的数组之间移动它们来隐藏/显示结构中的节点:children 当它们可见时; _children 当他们不是时。

您可能想尝试的是:

  • 确保在您的 JSON 数据中,每个 node 对象中都有一个 filename: _fileNameString_ 对象。 (就像您现在正在加载的 JSON 中有 name: _nodeName_

  • 那么,您的 click 函数必须执行以下操作:

    function click(d) {
      if (d.children) {
        d._children = d.children;
        d.children = null;
      } else if (!d.children && !d._children) {
        var nameOfTheFile = d.filename;
        var childObject = d3.json(nameOfTheFile);
        d.children.push(childObject);
      } else {
         d.children = d._children;
         d._children = null;
      }
      update();    
    }
    

请注意,我没有对此进行测试,所以我不确定它是否有效,但我认为这种方法可能是可行的。

编辑: 另请注意,这假设您的整个数据已经分布在多个文件中。所以,flare.json 文件,或者你首先用来加载你的第一个 JSON 数据的任何文件都有这样的结构:

{
  "name": "flare",
  "filename": "children1.json",
  "children": [ ]
}

children1.json 可能类似于:

[
  {
    "name": "cluster",
    "filename": "children2.json",
    "children": [ ]
  },
  {
    "name": "graph",
    "filename": "children3.json",
    "children": [ ]
  },
  {
    "name": "optimization",
    "filename": "children4.json",
    "children": [ ]
  }
]

等等...底线,您必须以某种方式在这些文件中以您想要/需要的结构将您的数据分布

【讨论】:

  • 我忘了在click()函数中添加,你应该检查节点是否有fileName,否则它可能会挂起......你在你的解决方案中考虑到了吗?
  • 是的,我已经实现了......我们只是在点击功能中加载了带有一些健全性检查的 json,并相应地更改了孩子......非常感谢!
  • 我是 d3 的新手,我试过你所说的,但孩子们的点击没有显示,任何例子都值得赞赏
  • @mcbalaji 也许您应该问自己的问题并将代码放在那里。这可能是一个不同的主题/问题。另外,控制台的输出是什么?
猜你喜欢
  • 1970-01-01
  • 2013-03-10
  • 2011-03-12
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2016-04-15
相关资源
最近更新 更多