【问题标题】:How to embed a D3 chart in a Polymer.dart element?如何在 Polymer.dart 元素中嵌入 D3 图表?
【发布时间】:2014-05-06 06:41:22
【问题描述】:

浏览器:Dartium 版本 34.0.1847.0 (258268)

我想将 D3 嵌入到 Polymer.dart 元素中,我刚刚开始理清 Dart 和 JS 是如何互操作的。我首先使用 D3 在how to make a bar chart 上的介绍性教程中的 HTML5/CSS3/JS 创建一个普通的 HTML 页面,以确保我的 D3 实现在 Dartium 中工作。

然后,我将 D3 代码移动到自定义聚合物元素(如下所示)及其配套的 dart 源文件(未显示)中。如何指示 D3 在 shadow DOM 中执行其选择?

<!-- D3 code copied from: http://bost.ocks.org/mike/bar/ -->
<polymer-element name="dart-js">
    <template>
        <!-- D3 style -->
        <style>
            .chart div {
                font: 10px sans-serif;
                background-color: steelblue;
                text-align: right;
                padding: 3px;
                margin: 1px;
                color: white;
            }
        </style>

        <content>
            <!-- D3 container -->
            <div class="chart">inside dart-js shadow-root</div>

            <!-- D3 JS -->
            <script type="application/javascript">
                console.log("inside content");

                var data = [4, 8, 15, 16, 23, 42];
                console.log("data: " + data); // data: 4,8,15,16,23,42

                console.log("select: <" + d3.select(".chart") + ">"); // select: <>

                // How do I instruct d3 to search inside the shadow DOM?
                d3.select(".chart")
                        .selectAll("div")
                        .data(data)
                        .enter().append("div")
                        .style("width", function (d) { return d * 10 + "px"; })
                        .text(function (d) { return d; })

            </script>
        </content>

    </template>
    <script type="application/dart;component=1" src="dart_js.dart"></script>
</polymer-element>

【问题讨论】:

    标签: d3.js dart dart-polymer


    【解决方案1】:

    d3 在 shadowDOM 中找不到元素,但您在 Dart 中查找该元素并将其传递给 d3 的 select 方法。

    类似的东西(未测试)

    import 'dart:js' as js;
    
    js.context['d3'].callMethod('select', [shadowRoot.querySelector('.chart')]);
    

    关于 Dart-JS-interop 的更多信息: https://www.dartlang.org/articles/js-dart-interop/

    【讨论】:

    • 这会有所帮助。 (我在文档中看到了您在 Dart Web Development 上的帖子。这两种技术是强大的组合。有/是否有人写过关于如何集成它们的教程?)
    • 我添加了一个链接(可能你已经知道了)。我不知道有人写过这方面的文档(但除了我在帖子、问题等中看到的内容之外,我对 Dart 团队正在做什么没有特别的了解)
    • 谢谢。对您的解决方案的一个小修正:callMethod 的第二个参数需要一个列表 - callMethod('select', [ shadowRoot.querySelector('.chart') ])。我将在下面的答案中添加一个更完整的帐户。
    • 你是对的。我知道这一点,但忘记添加 []
    【解决方案2】:

    我将打印条形图的 D3 JS 片段包装在一个函数中,并从 Dart 中调用它,如下所示:

    dart-js.html

    var x = function(elt) {
      console.log('x');
      d3.select(elt)
          .selectAll("div")
          .data(data)
          .enter().append("div")
          .style("width", function (d) { return d * 10 + "px"; })
          .text(function (d) { return d; });
    };
    

    dart_js.dart

    import 'package:polymer/polymer.dart';
    import 'dart:js' as js;
    
    @CustomTag('dart-js')
    class DartJs extends PolymerElement {
    
      /* Life cycle events */
      // required -- constructor must call superclass
      DartJs.created() : super.created() {
        print("dart-js started");
      }
    
      @override void enteredView() {
        super.enteredView();
        print('dart_js entered');
        js.context.callMethod('x', [shadowRoot.querySelector('.chart')]);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多