javascript - 使用 Node js 和 D3 实时在 map 上绘制国家名称

标签 javascript node.js d3.js redis

我一直在尝试使用 Redis Pub/Sub 系统、Node js 和 D3 在 map 上绘制各州的名称。 问题是,当我第一次在 Redis channel 上输入一个状态时,它被完美地绘制出来,但是当我输入第二个状态时,没有任何反应。由于我是 D3.js 的新手,所以无法找出问题所在。 任何帮助将不胜感激。谢谢。

d3.json("india-states.json", function (json) {
    india.selectAll("path")
    .data(json.features)
    .enter().append("path")
    .attr("d", path);
    var socket = io();
    socket.on('tags', function(data){
        console.log(data.message1);
        india.selectAll("text")
        .data(json.features)
        .enter()
        .append("text")
        .attr("fill", "black")
        .attr("transform", function(d) {
            console.log(data.message1 + "Second Time"); 
            var centroid = path.centroid(d);
            return "translate(" + centroid[0] + "," + centroid[1] + ")"
        })
        .attr("text-anchor", "middle")
        .attr("dy", ".35em")
        .style('fill', 'white')
        .text(function(d) {
            console.log("2");
            if (d.id == data.message1) {
                console.log("1");    
                return data.message1;
            }
        });
    });
});

我尝试探索我的代码,发现它每次都能正确获取州名称。但只有在第一次尝试时,状态名称才会在

console.log(data.message1);

在所有其他情况下,我只得到一个控制台输出,即“console.log(data.message1);”

最佳答案

为文本创建一个变量并将其移动到 socket 之外:

d3.json("india-states.json", function (json) {
india.selectAll("path")
  .data(json.features)
  .enter().append("path")
  .attr("d", path);

var stateText = india.selectAll(".text")
  .data(json.features)
  .enter()
  .append("text");//variable outside socket

var socket = io();

socket.on('tags', function(data){

    stateText.attr("fill", "black")
      .attr("transform", function(d) {
        console.log(data.message1 + "Second Time"); 
        var centroid = path.centroid(d);
        return "translate(" + centroid[0] + "," + centroid[1] + ")"
      })
      .attr("text-anchor", "middle")
      .attr("dy", ".35em")
      .style('fill', 'white')
      .text(function(d) {
        if (d.id == data.message1) {   
            return data.message1;
          }
      });
  });
});

如果你想跟踪你之前的message1,你可以在函数外创建一个数组,并循环遍历它:

d3.json("india-states.json", function (json) {
india.selectAll("path")
  .data(json.features)
  .enter().append("path")
  .attr("d", path);

var stateText = india.selectAll(".text")
  .data(json.features)
  .enter()
  .append("text");

var arrayStates = [];//this array will hold all the names

var socket = io();

socket.on('tags', function(data){

    arrayStates.push(data.message1);//for each input, a new string

    stateText.attr("fill", "black")
    .attr("transform", function(d) {
        var centroid = path.centroid(d);
        return "translate(" + centroid[0] + "," + centroid[1] + ")"
    })
    .attr("text-anchor", "middle")
    .attr("dy", ".35em")
    .style('fill', 'white')
    .text(function(d) {
        for(var i = 0; i < arrayStates.length; i++){
          if (d.id == arrayStates[i]) {   
            return arrayStates[i];
          }
        }
     });
  });
});

关于javascript - 使用 Node js 和 D3 实时在 map 上绘制国家名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125138/

相关文章:

javascript - 如何在 ReactJs 中使用状态作为检查属性?

javascript - 如何解决 TypeError : d3. 时间未定义?

svg - d3.js selectAll()。svg路径上的每个..未定义吗?

node.js - Puppeteer 由于 Node 模块错误而失败

javascript - 如何以可绘图格式输出 PHP 结果

javascript - Angular 时区 CDT/CST 问题

javascript - JavaScript Code School "Closures"任务中的打印问题

javascript - AngularJS 等待 $http 请求

javascript - NodeJS + MongoDB - 启动从 npm 安装的 mongodb 服务器实例

javascript - botConnection.activity$ node.js BOT