GWT Chart.js 实现抛出“无法获取 属性 'insertBefore' 未定义或空引用
GWT Chart.js implementation throws 'unable to get property 'insertBefore' of undefined or null reference
我正在尝试将 Chart.js 图表 (http://www.chartjs.org) 集成到当前的 GWT 项目中。我有识别 javaScript 的项目,但是当我尝试实例化图表时,我的浏览器抛出以下 JavaScript 错误:
Unable to get property 'insertBefore' of undefined or null reference
使用以下似乎是问题根源的 GWT 代码片段:
Public class PieChart implements IsWidget
{
Canvas c;
public JavaScriptObject jsChart;
public PieChart()
{
c = Canvas.createIfSupported();
if (c.getContext2d().getCanvas().getParentNode() == null)
{
//Debug message here
}
jsChart = init(c.getContext2d());
}
private native JavaScriptObject init(Context2d ctx)
/*-{
var data = [];
return new $wnd.Chart(ctx).Pie(data); //<-- *Explodes here*
}-*/;
@Override
public Widget asWidget() { return c; }
}
此 PieChart class 的一个实例在客户端创建期间创建并添加到 VerticalPanel。
null 调试检查条件显示 parentNode 确实为 null,深入 JavaScript 显示在创建 Chart 对象期间对 'parentNode.insertBefore' 的调用 - 所以它自然会失败。
Canvas c 的空检查揭示了一个有效的对象,但没有父节点所以在我看来,我的 html 文档有问题使得 Canvas是最顶层的对象,或者我的项目整体存在配置问题,导致对 Canvas 创建方法的调用成为 return 构造不当的实例。
有没有办法将我创建的 Canvas 人为地隐藏一层,这样 parentNode 就不会为空(或类似的东西)?还是我漏掉了一步?
这是我页面的HTML:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link type="text/css" rel="sytlesheet" href="viewer.css">
<title>Viewer</title>
<script type="text/javascript" language="javascript" src="viewer/moment.js"></script>
<script type="text/javascript" language="javascript" src="viewer/Chart.js"></script>
<script type="text/javascript" language="javascript" src="viewer/viewer.nocache.js"></script>
</head>
<body>
<noscript>
...
</noscript>
</body>
</html>
该项目无法在 public 互联网上托管,因此需要像 Chart.js
这样的离线解决方案
我也愿意使用与 GWT 配合良好的其他离线图表包。但是,替代品必须获得开源许可或以其他方式在全球范围内免费商业分发,以符合 ITAR 出口合规性。
谢谢大家!
private native JavaScriptObject init(Context2d ctx)
/*-{
var data = [];
return $wnd.Chart(e).Pie(data); //<-- *Explodes here*
}-*/;
什么是e
?传给图表的时候允许此时undefined吗?
快速浏览一下链接项目,您应该使用 new
创建 Chart
,并且您应该传递 canvas Context2d 实例 ctx
而不是这个未知的 e
.
也很可能由于 canvas 的工作方式,如果您的 canvas 未附加到 dom,并且您的 PieChart
将无法正常运行构造函数在调用 init
之前不会附加它。如果这是一项要求,您可能需要在小部件的附加事件关闭或调用 onAttach
之前不调用 init
,但您应该了解有关如何包装此项目的更多信息。
有 GWT 兼容的图表库,包括 Lienzo、GXT 和 Highcharts。完全披露,我在 Sencha 构建 GXT 方面工作了几年,因此在那里有明显的偏好。
我正在尝试将 Chart.js 图表 (http://www.chartjs.org) 集成到当前的 GWT 项目中。我有识别 javaScript 的项目,但是当我尝试实例化图表时,我的浏览器抛出以下 JavaScript 错误:
Unable to get property 'insertBefore' of undefined or null reference
使用以下似乎是问题根源的 GWT 代码片段:
Public class PieChart implements IsWidget
{
Canvas c;
public JavaScriptObject jsChart;
public PieChart()
{
c = Canvas.createIfSupported();
if (c.getContext2d().getCanvas().getParentNode() == null)
{
//Debug message here
}
jsChart = init(c.getContext2d());
}
private native JavaScriptObject init(Context2d ctx)
/*-{
var data = [];
return new $wnd.Chart(ctx).Pie(data); //<-- *Explodes here*
}-*/;
@Override
public Widget asWidget() { return c; }
}
此 PieChart class 的一个实例在客户端创建期间创建并添加到 VerticalPanel。
null 调试检查条件显示 parentNode 确实为 null,深入 JavaScript 显示在创建 Chart 对象期间对 'parentNode.insertBefore' 的调用 - 所以它自然会失败。
Canvas c 的空检查揭示了一个有效的对象,但没有父节点所以在我看来,我的 html 文档有问题使得 Canvas是最顶层的对象,或者我的项目整体存在配置问题,导致对 Canvas 创建方法的调用成为 return 构造不当的实例。
有没有办法将我创建的 Canvas 人为地隐藏一层,这样 parentNode 就不会为空(或类似的东西)?还是我漏掉了一步?
这是我页面的HTML:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link type="text/css" rel="sytlesheet" href="viewer.css">
<title>Viewer</title>
<script type="text/javascript" language="javascript" src="viewer/moment.js"></script>
<script type="text/javascript" language="javascript" src="viewer/Chart.js"></script>
<script type="text/javascript" language="javascript" src="viewer/viewer.nocache.js"></script>
</head>
<body>
<noscript>
...
</noscript>
</body>
</html>
该项目无法在 public 互联网上托管,因此需要像 Chart.js
这样的离线解决方案我也愿意使用与 GWT 配合良好的其他离线图表包。但是,替代品必须获得开源许可或以其他方式在全球范围内免费商业分发,以符合 ITAR 出口合规性。
谢谢大家!
private native JavaScriptObject init(Context2d ctx)
/*-{
var data = [];
return $wnd.Chart(e).Pie(data); //<-- *Explodes here*
}-*/;
什么是e
?传给图表的时候允许此时undefined吗?
快速浏览一下链接项目,您应该使用 new
创建 Chart
,并且您应该传递 canvas Context2d 实例 ctx
而不是这个未知的 e
.
也很可能由于 canvas 的工作方式,如果您的 canvas 未附加到 dom,并且您的 PieChart
将无法正常运行构造函数在调用 init
之前不会附加它。如果这是一项要求,您可能需要在小部件的附加事件关闭或调用 onAttach
之前不调用 init
,但您应该了解有关如何包装此项目的更多信息。
有 GWT 兼容的图表库,包括 Lienzo、GXT 和 Highcharts。完全披露,我在 Sencha 构建 GXT 方面工作了几年,因此在那里有明显的偏好。