我看到很多人推荐用于组织结构图的JavaScript Visualization Toolkit(The JIT)。我正在尝试使用SpaceTree的JavaScript InfoVis Toolkit来组织图表。我的组织结构图中的节点本身就像一个组件,其中包含员工个人资料图片,两个不同的图标显示点击叠加,以及约3行简单文本,其中包含姓名,标题和报告数...每行分开通过浅水平线。类似的东西:
我的问题是,是否可以将spacetree节点自定义到这样的程度?我可以让Node几乎像另一个具有自己的render方法的“组件”或JavaScript对象吗?
我在论坛上研究过,我考虑过的一些选项是:
答案 0 :(得分:5)
Spacetree可以非常定制。节点可以显示图像或我们想要的任何内容。我们可以为节点提供自定义点击事件。要拥有自定义事件,您必须在onclick事件中重绘整个树。
这是一个例子。关于click事件的成功功能。在这里,我在“可点击”类中调用了click事件
$.ajaxSetup({ cache: false });
$(".clickable").live("click", function () {
$.ajax({
url: url + "?id=" + parentId + "&ts=" + new Date().getMilliseconds(),
type: "POST",
cache: false,
dataType: "html",
success: function (html) {
init(html);
}
});
});
name属性可用于提供如下图像:
{id:"90", name:"<a href='javascript:;' class='clickable' name='90'><img src='images/picture.gif' width='30' height='30' alt='pic' /></a>", data:{}, children:[]}
如果有用,请标记为答案。感谢。
答案 1 :(得分:1)
您可以将yourNode作为Graph.node的原型祖先,设置所需的插槽,然后添加适当的渲染/强制代码自定义。
答案 2 :(得分:0)
我正在使用spacetrees,我只是将标签类型设置为HTML(这是默认设置),您可以使用常规HTML和CSS来设置标签样式。我有图像,链接,文字等。
请注意,您使用的是标签,而不是节点。节点是图形组件;标签是您看到的代表节点的视觉效果。
在“onCreateLabel”函数中初始化spacetree传递时:
var myOnCreateLabel = function(label, node) {
label.onclick = function(event) {/* setup onclick handler */};
label.innerHTML = "<img src='myImage.png' />"; // use image in label
};
var myST = new $jit.ST({/*other settings*/ onCreateLabel: myOnCreateLabel});
答案 3 :(得分:0)
如果您不介意仅使用HTML5 / Canvas,请尝试使用http://orgplot.codeplex.com,简单的界面支持图像节点。
答案 4 :(得分:0)
this.st=new $jit.ST(
{
onCreateLabel: function (label, node)
{
var labelContent = $('<table cellpadding="0" cellspacing="0" class="nodeContainer"><tr><td>' +
'<div class="buttonContainer">' +
'</div></td></tr><tr><td>' +
'<table class="nodeBox" cellpadding="0" cellspacing="0">' +
'<tr>' +
'<td class="iconTd"></td>' +
'<td class="center nodeName">' + node.name + '</td>' +
'</tr></table>' +
'</td></tr></table>');
thisObject.onCreateLabel.raise(thisObject, { labelContent: labelContent, node: node });
if (node.data && node.data.Icon && node.data.Icon != "")
{
labelContent.find(".iconTd").append($("<img src='" + node.data.Icon + "' alt=''>"));
}
else
{
labelContent.find(".iconTd").remove();
}
var lblCtl = $(label).append(labelContent);
if (node.data.Data.ChildrenCount)
{
labelContent.append("<tr><td class='subnode'></td></tr>");
}
if (node.name.length > 40)
{
lblCtl.attr("title", node.name);
node.name = node.name.substr(0, 37);
node.name = node.name + "...";
}
lblCtl.click(function (sender)
{
//thisObject.isNodeClicked = true;
var target = $(sender.target);
if (!target.hasClass("subnode"))
{
if (thisObject.currentSelectedNode)
{
thisObject.currentSelectedNode.buttonContainer.hide();
}
var btnContainer = labelContent.find(".buttonContainer");
thisObject.currentSelectedNode = { nodeElement: lblCtl, node: node, buttonContainer: btnContainer, event: sender };
btnContainer.append(thisObject.$globalButtonContainer.show()).show();
var button = target.closest(".chartActionButton");
if (button.length > 0)
{
thisObject.onNodeAction.raise(thisObject, { name: button.attr("name"), nodeElement: lblCtl, node: node, button: target });
}
else
{
thisObject.onNodeClick.raise(thisObject, thisObject.currentSelectedNode);
}
}
else
{
thisObject.st.onClick(node.id);
}
});
label.id = node.id;
//set label styles
thisObject.setNodeStyle(node.data.Style, label.style);
}
});