Echarts实现点击节点显示 隐藏子节点

问题背景

     项目中一个根节点,根节点有七八个子节点,子节点有较多的孙子节点。不美观,因此需要将孙子节点隐藏,当点击子节点时再去显示此子节点对应的孙子节点,再次点击则隐藏孙子节点。

问题解决

     Echarts的links的source target可以为边的源节点名称的字符串,也支持使用数字表示源节点的索引,所以创建links链接数据节点时source target使用字符串就是使用data节点的id属性指定的值,使用int就是使用data数据的在数组中的索引位置,而不是id值。

    实现节点的显示隐藏,只要将需要显示的节点赋值给series的data属性,而links属性不需要做任何改变,某天连接只要两端的某一个节点不存在data属性中,就不会显示这条边。因此,节点显示隐藏只需要控制赋值给data的数组节点即可。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECharts</title>
<!-- 引入 echarts.js -->
<script type="text/javascript" src="/cityGuardServer/js/echarts.js"></script>
<script type="text/javascript" src="/cityGuardServer/js/jquery-3.3.1.js"></script>
<style type="text/css">
html, body {
	height: 100%;
	overflow: hidden;
}

html {
	background-image: url('/cityGuardServer/assets/image-analysis-body.png');
}

div {
	
}
</style>
</head>
<body style="background-color: rgba(ffffaa)">
	<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
	<div id="main" style="width: 100%; height: 100%; margin: 0 auto;"></div>
	<script type="text/javascript">
	<!-- ?car_number= & region = -->
		var url = document.location.toString();
		console.log(url);
		var arrUrl = url.split("?");
		var carParam = arrUrl[1].split("&");
		var carParamArr = carParam[0].split("=");
		var regionParamArr = carParam[1].split("=");
		var car_number = decodeURI(carParamArr[1]).toString();
		var region = decodeURI(regionParamArr[1]).toString();
		//console.log(car_number +" " + region);
		//var param = "{\"args\":'{\"region\":\"1\",\"car_number\":"+car_number+"}'}";
		var param = "{\"region\":" + region + ",\"car_number\":\"" + car_number
				+ "\"}";

		var mapObj = new Map();

		//var param = "{args:'{\"region\":\"1\",\"car_number\":\"云aaa\"}'}";
		var myChart = echarts.init(document.getElementById('main'));
		var master;
		//节点的分类数据以及图例显示数据
		var categories = [ {
			name : '车',
			itemStyle : {
				color : '#fc0800'
			}
		}, {
			name : '人',
			itemStyle : {
				color : '#E29E00'
			}
		}, {
			name : '人绑定其他车',
			itemStyle : {
				color : '#0be200'
			}
		} ];
		var option = {
			//图例显示 每个图例样式需要在一个对象里写出来
			legend : [ {
				data : categories.map(function(a) {
					return a.name;
				}),
				textStyle : {
					color : "#ffffff"
				}
			} ],
			//连线和节点 提示框内容
			tooltip : {
				//回调函数显示
				formatter : function(params) {
					str = params.data.name;
					return str;
				},
				backgroundColor : '#8CC7B5',
				padding : [ 5, 10, 5, 10 ],
				textStyle : {
					fontFamily : 'Courier New'
				}
			},
			animationDuration : 1500,
			animationEasingUpdate : 'quinticInOut',
			//各个系列显示的数据格式
			series : [ {
				//节点、连线样式
				itemStyle : {
					normal : {
						//添加阴影 
						borderColor : '#fff',
						borderWidth : 1,
						shadowBlur : 10,
						ShadowColor : 'rgab(0,0,0,0.3)',

						lineStyle : {
							color : '#ffffff',
							curveness : 0.3,
							width : 3,
							opacity : 0.7
						},
					},

				},

				//节点显示的标签内容
				label : {
					position : 'right',
					formatter : '{b}',
					//回调函数显示
					/* formatter : function(params) {
						str = params.data.id;
						return str;
					}, */
					show : true,
					textStyle : {
						color : '#ffffff'
					},
				},
				categories : categories,
				force : {
					initLayout : 'circular',//初始布局
					repulsion : [ 60, 120 ],//斥力大小
					edgeLength : [ 30, 100 ],
					layoutAnimation : true,
				},

				animation : false,
				name : "",
				type : 'graph',//关系图类型
				layout : 'force',//引力布局
				roam : true,//可以拖动
				focusNodeAdjacency : true,
				emphasis : {
					lineStyle : {
						width : 8
					}
				},
				//节点和关联数据置空,下面Ajax获取数据填充即可
				nodes : [],
				links : []
			} ]
		}
		myChart.setOption(option);
        //记录所有节点
		var allArr = [];
        //记录需要显示的节点
		var display = [];
        //记录连接信息,通过这个数组得到节点 子节点关系
		var linkArr = [];
		//异步获取数据
		$.ajax({
			type : "POST",
			url : "/projectname/analysis_car/car_graph_history?args="
					+ param,
			dataType : "json",
			data : {},
			success : function(data) {
				console.log(data.nodes);
				console.log(data.links);
				linkArr = data.links;
				allArr = data.nodes;
				display = allArr.filter(function(x, index) {
					return x.category != 2;
				});
				console.log(display);
				myChart.setOption({
					series : [ {
						nodes : display,
						links : data.links
					/* nodes : [{symbol: "circle", symbolSize: 27, name: "n0", id: "云A2RG210", category: 0},
					         {symbol: "circle", symbolSize: 27, name: "n1", id: "云A2RG20", category: 0}],
					links : [{source:"云A2RG210",target:"云A2RG20"}] */
					} ]
				});//将option添加到mychart中
			},
			error : function(err) {
				console.log(param);
			}
		});
		//下面为点击某个节点之后进行的操作,其实就是像display加入要显示的子节点.节点的显示和隐藏只是改变节点data数组即可,link始终不需要改变。
		myChart.on('click', function(params) {
            //本次点击需要添加或删除的节点
			var addArr = [];
            //记录本次点击需要添加的元素是否已经在display数组中,如果在,说明本次点击需要从    
            //display中删除掉addArr中节点;不在,需要添加到待显示数组display中
			var exist = false;
			if (params.data.category == '1') {
				var temp = linkArr.filter(function(x, index) {
					if (x.source == params.data.id) {
						return x;
					}
				});
				console.log(temp);
				//判断display里面是否有本次添加的元素,如果有,说明节点已经显示,就去删除
				for (var k = 0; k < display.length; k++) {
					for (var i = 0; i < temp.length; i++) {
						if (display[k].id == temp[i].target) {
							exist = true;
							break;
							console.log(x.id);
						}
					}
					if (exist) {
						break;
					}
				}
				console.log(exist);
				//得到需要添加或删除的节点元素
				allArr.forEach(function(x, index, a) {
					temp.forEach(function(y, indey, b) {
						if (x.id == y.target) {
							addArr.push(x);
						}
					});
				});
			} else {
				return;
			}
			if (!exist) {
				display = display.concat(addArr);
			} else {
				var disTemp = [];
				for (var i = 0; i < display.length; i++) {
					var del = false;
					for (var j = 0; j < addArr.length; j++) {

						if (display[i].id == addArr[j].id) {
							del = true;
							break;
						}
					}
					if (!del) {
						disTemp.push(display[i]);
					}
				}
				display = disTemp;
			}
			myChart.setOption({
				series : [ {
					nodes : display,
				} ]
			});
		});
	</script>
</body>
</html>

    

猜你喜欢

转载自blog.csdn.net/qq_22310551/article/details/83830064