【问题标题】:d3.js tree with json string dont recognize as Array带有 json 字符串的 d3.js 树不能识别为数组
【发布时间】:2015-09-20 00:46:41
【问题描述】:

我正在使用 d3.js 来显示一棵树。

问题是下一个:

如果我在 javascript 中 var data1 = [ { "name" : "Level 2: A", "parent":"Top Level" }, ];

这很好用(我的意思是视图向我展示了树)。但是,如果我在视图中有 json 字符串: String dataTree = (String) ViewData["dataTree"];

然后在 Javascript 中我这样做: var data = '@dataTree';

控制台返回错误

未捕获的类型错误:data.reduce 不是函数

在源代码中我看到了

var data = '[{"name":"root"]

(带有 &quot 的变量)。

下面我复制了我在视图中使用的代码来显示带有 d3.js 的树:

var data = '@dataTree';

// *********** Convert flat data into a nice tree ***************
// create a name: node map
var dataMap = data.reduce(function(map, node) {
    map[node.name] = node;
    return map;
}, {});

// create the tree array
var treeData = [];
data.forEach(function(node) {
    // add to parent
    var parent = dataMap[node.parent];
    if (parent) {
        // create child array if it doesn't exist
        (parent.children || (parent.children = []))
            // add node to child array
            .push(node);
    } else {
        // parent is null or missing
        treeData.push(node);
    }
});

// ************** Generate the tree diagram  *****************
var margin = {top: 20, right: 120, bottom: 20, left: 120},
    width = 960 - margin.right - margin.left,
    height = 500 - margin.top - margin.bottom;

var i = 0;

var tree = d3.layout.tree()
    .size([height, width]);

var diagonal = d3.svg.diagonal()
    .projection(function(d) { return [d.y, d.x]; });

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.right + margin.left)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

root = treeData[0];

update(root);

function update(source) {

    // Compute the new tree layout.
    var nodes = tree.nodes(root).reverse(),
        links = tree.links(nodes);

    // Normalize for fixed-depth.
    nodes.forEach(function(d) { d.y = d.depth * 180; });

    // Declare the nodes…
    var node = svg.selectAll("g.node")
        .data(nodes, function(d) { return d.id || (d.id = ++i); });

    // Enter the nodes.
    var nodeEnter = node.enter().append("g")
        .attr("class", "node")
        .attr("transform", function(d) { 
            return "translate(" + d.y + "," + d.x + ")"; });

    nodeEnter.append("circle")
        .attr("r", 10)
        .style("fill", "#fff");

    nodeEnter.append("text")
        .attr("x", function(d) { 
            return d.children || d._children ? -13 : 13; })
        .attr("dy", ".35em")
        .attr("text-anchor", function(d) { 
            return d.children || d._children ? "end" : "start"; })
        .text(function(d) { return d.name; })
        .style("fill-opacity", 1);

    // Declare the links…
    var link = svg.selectAll("path.link")
        .data(links, function(d) { return d.target.id; });

    // Enter the links.
    link.enter().insert("path", "g")
        .attr("class", "link")
        .attr("d", diagonal);

}

更新:问题是 dataTree 不能识别为数组。不知道为什么

【问题讨论】:

    标签: javascript c# json serialization d3.js


    【解决方案1】:

    将 C# 值传递给 HTML/JavaScript 时,最好使用输入值。

    在视图中,你这样做:

    @Html.HiddenFor(t=> t.yourdata)
    

    在 JavaScript 中,你可以这样做:

    var data = $('yourdata').val();
    

    您得到的错误意味着您正在对非数组变量执行array.reduce

    【讨论】:

    • 能把Html.HiddenFor的代码和javascript的代码复制一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多