2015-09-21 73 views
1

我在浏览器中使用d3.json函数显示表。当json文件中的数据发生变化时,浏览器中的表格不会刷新。它显示的是以前的数据,而不是表中的新数据。如果我在浏览器中手动刷新,那么它会正常工作,表格随新数据而变化。D3.js表在数据更改时不刷新

这里是我使用的代码:

<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> 

td{ 
    padding:7px; border:#4e95f4 1px solid; 
} 

/* provide some minimal visual accomodation for IE8 and below */ 
th{ 
    background: #dae5f4; 
    border: 1px solid black; 
     padding: 2px 4px; 
     font-weight: bold; 
} 

/* Define the background color for all the ODD background rows */ 
tr:nth-child(odd){ 
    background: #b8d1f3; 
} 

/* Define the background color for all the EVEN background rows */ 
tr:nth-child(even){ 
    background: #dae5f4; 
} 

a 
{ 
position: absolute; 
} 

</style> 
<body> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> 
<div id="container"></div> 
<a href="http://192.168.7.102:3000/data/traffic" download="">Download</a> 
<script> 

var jsonURL = "http://192.168.7.102:3000/data/traffic"; 

d3.json(jsonURL, function(data) { 
    // the columns you'd like to display 
    var columns = ["Clients", "Traffic", "Rank"]; 

    var table = d3.select("#container").append("table") 
     .style("margin-top", "50px") 
      .style("margin-left","280px") 
      .style("border-collapse", "collapse")   // <= Add this line in. 
      .style("border", "2px black solid") 
      .style("width", "50%"), 
     thead = table.append("thead"), 
     tbody = table.append("tbody"); 

    // append the header row 
    thead.append("tr") 
     .selectAll("th") 
     .data(columns) 
     .enter() 
     .append("th") 
      .text(function(column) { return column; }); 

    // create a row for each object in the data 
    var rows = tbody.selectAll("tr") 
     .data(data) 
     .enter() 
     .append("tr"); 

    // create a cell in each row for each column 
    var cells = rows.selectAll("td") 
     .data(function(row) { 
      return columns.map(function(column) { 
       return {column: column, value: row[column]}; 
      }); 
     }) 
     .enter() 
     .append("td") 
      .text(function(d) { return d.value; }); 
}); 
</script> 

图表没有刷新时在JSON文件数据的变化。 有没有人有任何想法问题在哪里?

我创建了node.js应用程序和宁静的web服务,根据用户需求从数据库中获取数据,并将数据写入“traffic.json”文件。当用户在应用程序中选择特定图表时,我们将该HTML文件发送到浏览器。在HTML中,d3.json函数正在触发。因为你的d3.json(jsonURL, function(data) {...})是不听更改您的数据文件

Here is the code I use: 
======================= 
var express = require('express'), 
http = require('http'), 
querystring = require('querystring'), 
router = express.Router(), 
fs = require('fs'), 
MongoClient = require('mongodb').MongoClient, 
format = require('util').format, 
mongo = require('mongodb'), 
monk = require('monk'), 
json2csv = require('json2csv'), 
Reloader = require('reload-json'), 
reload = new Reloader(); 

var Start_Date ; 
var End_Date ; 
var Client_Ip; 
var Clientip; 
var ChooseData; 
var Charts; 
var Chart1; 
var Choosedata1; 
//Getting the data from calsoftlabs page 
router.post('/myaction', function(req, res, next) { 

    Start_Date = req.body.StartDate +'T'+ req.body.StartTime ; 
    End_Date = req.body.EndDate +'T'+ req.body.EndTime; 
    Client_Ip = req.body.ClientIP; 
    Clientip = req.body.ClientIPS; 
    ChooseData = req.body.ChooseData; 
    Charts  = req.body.Charts; 
    Chart1  = req.body.Chart; 
    Choosedata = req.body.Data; 

//converting date and time to timestamp. 
function evaldate(input){ 
var date = new Date(input); 
return date.getTime(); 
} 

var Start_timestamp = evaldate(Start_Date), 

End_timestamp = evaldate(End_Date); 


var dbdata, 
start_time, 
end_time, 
client_ip, 
choosedata, 
options, 
data, 
req; 
//sending parameters to restfull webapp service 
if(Choosedata == "upload" || Choosedata == "download") { 
data = querystring.stringify({ 
     start_time: Start_timestamp, 
     end_time: End_timestamp, 
     client_ip: Clientip, 

    }); 
} else if(ChooseData == "upload_traffic" || ChooseData == "download_traffic" || ChooseData == "both") { 

data = querystring.stringify({ 
     client_ip: Client_Ip, 
    }); 

} 
console.log(data); 

if(ChooseData == "upload_traffic") { 

options = { 
    host: 'localhost', 
    port:8080, 
    path:'/restful/traffic/upload_traffic', 
    method:'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 

} else if(ChooseData == "download_traffic") { 

options = { 
    host: 'localhost', 
    port:8080, 
    path:'/restful/traffic/download_traffic', 
    method:'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 


} else if(Choosedata == "upload") { 

options = { 
    host: 'localhost', 
    port:8080, 
    path:'/restful/traffic/upload', 
    method:'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 

}else if(Choosedata == "download"){ 

options = { 
    host: 'localhost', 
    port:8080, 
    path:'/restful/traffic/download', 
    method:'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 

} else if(ChooseData == "both") { 

options = { 
    host: 'localhost', 
    port:8080, 
    path:'/restful/traffic/both', 
    method:'POST', 
    headers: { 
     'Content-Type': 'application/json', 
    } 
}; 

} 

//creating file, writing network data to a file. 
var fileName = 'views/traffic.json'; 
req = http.request(options, function(response) { 
var jsonString = ''; 
response.on('data', function(data) { 
    jsonString += data; 
}); 
response.on('end',function(){ 
    console.log(jsonString); 
    fs.writeFile(fileName, jsonString,'utf-8'); 
    }); 
}); 

if(Chart1 == 'Line') { 

    res.sendfile('views/Line.html'); 

} else if(Chart1 == 'Bar') { 

res.sendfile('views/Newbar.html'); 

} else if(Chart1 == 'Area') { 

res.sendfile('views/Area.html'); 

} else if(Chart1 == 'Pie') { 

res.sendfile('views/Pie.html'); 

} else if(Chart1 == 'Multiline') { 

res.sendfile('views/Multiline.html'); 

} else if(Chart1 == 'All') { 

res.sendfile('views/Newall.html'); 

} else if(Charts == 'Table') { 

res.sendfile('views/Table.html'); 

} else if(Charts == 'StackedBar') { 

res.sendfile('views/StackedBar.html') 

} 

req.write(data); 
req.end(); 
req.on('error', function(e) { 
    console.error(e); 
}); 
}); 

module.exports = router; 

回答

0

你的表是不是清爽。该功能将运行一次,就是这样。

说你再次运行在一定的时间间隔数据功能d3.json(jsonURL, function(data) {...})你的下一个问题将是你永远不会更新表,但他们只是在一个新问题:

var table = d3.select("#container").append("table") 

你不选择你的表(可能已经存在),但只是将一个新表添加到DOM。你需要看看data binding principle in d3

+0

当我访问jsonURL时,它显示新的数据。但是,当函数d3.json(jsonURL,函数(数据){...})在数据更改时加载之前的数据而不是新的数据。 –

+0

如果数据频繁更改,则可能在浏览器或服务器端遇到缓存问题。最简单的解决方法是每次更改请求URL。 – svdwoude

+0

我试过像这样var jsonURL =“http://192.168.7.102:3000/data/traffic”; (jsonURL +“?”+ Math.floor(Math.random()* 1000),function(error,data){。但是我面临同样的问题,它不会加载新的数据。 –

相关问题