Grafana插件开发:Datamap无法作为构造函数使用的问题求助
解决Grafana插件中Datamap不是构造函数的问题
看起来你遇到的核心问题是没有正确从datamaps模块中获取到Datamap构造函数,加上代码里还有一个DOM元素ID的小疏忽,导致了这个错误。我来一步步帮你解决:
1. 修正Datamap的导入与赋值
Grafana使用SystemJS管理模块,你的System.register声明里虽然导入了./datamaps,但并没有正确从模块中提取Datamap构造函数。修改你的导入代码如下:
System.register(['app/plugins/sdk', 'lodash','./datamaps'], function (_export, _context) { var PanelCtrl, _, datamapsModule, _createClass, panelDefaults, DoMapCtrl, Datamap; return { setters: [ // 处理sdk模块 function (sdk) { PanelCtrl = sdk.PanelCtrl; }, // 处理lodash模块 function (lodash) { _ = lodash; }, // 接收datamaps模块对象 function (datamaps) { datamapsModule = datamaps; } ], execute: function () { // 兼容datamaps不同的导出形式,获取构造函数 Datamap = datamapsModule.default || datamapsModule.Datamap || datamapsModule; // 保留你原有的类方法逻辑 _createClass(DoMapCtrl, [ { key: 'updateDoMap', value: function updateDoMap() { console.log("update: ",this.panel.foo); // 统一DOM元素ID的判断与使用 var mapContainer = document.getElementById('basic'); if(mapContainer){ new Datamap({ element: mapContainer }); } this.nextTickPromise = this.$timeout(this.updateDoMap.bind(this), 1000); } }, { key: 'onRender', value: function onRender() { console.log("onRender"); } } ]); } }; });
2. 修正DOM元素ID的不一致问题
你原来的代码里判断的是document.getElementById('container'),但创建Datamap时却用了document.getElementById("basic"),这会导致元素判断和实际使用不匹配,可能跳过Datamap创建或者找不到目标元素。上面的代码已经统一为basic,你可以根据实际HTML中的元素ID调整。
3. 确认datamaps的依赖是否加载
Datamaps依赖D3.js,你需要确保D3已正确加载到Grafana环境中:
- 如果是将datamaps和D3放在插件目录下,要确保D3脚本在datamaps之前加载
- 如果是通过npm安装依赖,要在插件的
plugin.json里声明对D3的依赖,或者在SystemJS配置中正确映射D3的路径
错误原因解析
当使用System.register导入模块时,必须通过setters数组接收每个导入的模块对象,再从中提取需要的导出。你之前只声明了Datamap变量但未赋值,导致它为undefined,自然会触发“不是构造函数”的报错。
内容的提问来源于stack exchange,提问作者Matteo Bononi 'peorthyr'
相关产品推荐
相关产品推荐

