在 thinger.io HTML 小部件的 JavaScript 块中使用 {{value}}

Using {{value}} in the JavaScript block of the thinger.io HTML widget

我尝试在 thinger.io 仪表板中使用 JavaScript 代码编写 HTML 小部件 .来自 "thing" 的数据可以在 HTML 中使用,方法是将下一个代码 {{value}} 插入到某些 HTML 标签体中。

但是,我不能在JavaScript块中使用它。

纯 HTML 小部件:

例如在 HTML 小部件中使用:

<h1>Millis data</h1>
<p>Millis value is </p><b>{{value}}</b>

这个的结果

带有 JavaScript 块的小部件(不按需要工作):

我尝试使用相同的数据进行绘图(Plotly 示例)。 我可以在 HTML 标签 id=data 中使用,但是,我不知道如何在 [=81= 中使用这些数据]块。

我的尝试:

<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>

<div id="data" value={{value}}>Data - {{value}}</div>
<div id="tester" style="width:900px;height:300px;"></div>


<script>
    TESTER = document.getElementById('tester');
    Plotly.newPlot( TESTER, [{
    x: [1, 2, 3, 4, 5],
    y: [1, 2, 4, 8, 16] }], {
    margin: { t: 0 } } );
</script>

生成的小部件: - 图中的数据是硬编码 仅供示例

我需要帮助将 ```{{value}}`` 数据集成到 thinger.io [=74] 中的 JavaScript 代码中=] 小部件。

似乎没有记录在 HTML 小部件中获取值的方法。

相反,可以使用 MutationObserver 来监听数据 div 的变化。当 div 有更新时,这可以创建 Plotly 图。 (您也可以使用 jQuery 来处理更改,但这种方法使用较少的依赖项。)

<div id="data" value={{value}}>Data - {{value}}</div>
<div id="tester" style="width:900px;height:300px;"></div>

<script>
    var createPlot = function(dataEl) {
      let value = dataEl.getAttribute('value');

      console.log(`creating plot with: ${value}`);
      if (value) {
        TESTER = document.getElementById('tester');
        Plotly.newPlot( TESTER, [{
          x: [1, 2, 3, 4, 5],
          y: JSON.parse(value) }], {
          margin: { t: 0 } }
        );
      }
    }

    var dataEl = document.getElementById('data');

    var script = document.createElement('script');
    script.onload = function () {
        createPlot(dataEl);
    };
    script.src = "https://cdn.plot.ly/plotly-latest.min.js";

    document.head.appendChild(script);

    var observer = new MutationObserver(function(mutations) {
        // create plot only if Plotly has loaded
        if (Plotly) {
          createPlot(dataEl);
        }
    });

    // setup the observer
    var target = document.querySelector('#data');
    var config = { attributes: true, attributeFilter: [ 'value'] };
    observer.observe(target, config);

</script>

剧情脚本可能会在div更新后加载。因此,创建情节的触发器可能是脚本加载或 div 变异。无论哪种情况,都需要加载 plotly 并且 div 需要更新。

value 属性也是一个字符串,因此需要使用 JSON.parse().

从字符串转换而来

测试

为了对此进行测试,我创建了一个 HTTP 设备并添加了一个 属性 和字符串值 [20,41,63,83,103]:

小部件是使用此 属性:

配置的

结果: