antvis/G2

一个chart有两个类型相似的view, 分别采用同一个数据源产生的两个dataView作为数据, 在这种场景下如何实现用一个slider同时影响两个view? 是否有参考案例推荐?谢谢! #2331

BillSun2080 posted onGitHub

<!-- Thank you for reporting an issue. 1. It's RECOMMENDED to submit PR for typo or tiny bug fix. 2. If this's a FEATURE request, please provide: details, pseudo codes if necessary. 3. If this's a BUG, please provide: course repetition, error log and configuration. Fill in as much of the template below as you're able. 4. It will be nice to use to provide a CodePen Link which can reproduce the issue, we provide a CodePen template g2-github-issue. 感谢您向我们反馈问题。 1. 提交问题前,请先阅读 https://antv.alipay.com/zh-cn/g2/3.x/index.html 上的文档。 2. 我们推荐如果是小问题(错别字修改,小的 bug fix)直接提交 PR。 3. 如果是一个新需求,请提供:详细需求描述,最好是有伪代码实现。 4. 如果是一个 BUG,请提供:复现步骤,错误日志以及相关配置,并尽量填写下面的模板中的条目。 5. 如果可以,请提供尽可能精简的 CodePen 链接,可使用 CodePen 模板 https://codepen.io/leungwensen/pen/WXJgox,方便我们排查问题。 6. 扩展阅读:如何向开源项目提交无法解答的问题 -->

  • G2 Version: 4.0.7

  • Platform: Ant Design Pro

  • Mini Showcase(like screenshots): image

  • CodePen Link: N/A

<!-- Enter your issue details below this comment. -->


项目中同样的需求,我的解决方案是:

  1. 在最后一个view上,配置slider
  2. 监听配置slider的view的afterpaint事件,更新其他view

代码看起来像是这样:

   const chart = new Chart({
      container: "container",
      width: 800,
      height: 400,
    });

    const view1 = chart.createView({
      region: {
        start: { x: 0, y: 0 },
        end: { x: 1, y: 0.5 },
      },
    });
    view1.data(data);
    view1.interval().position("time*money");

    const viewLast = chart.createView({
      region: {
        start: { x: 0, y: 0.5 },
        end: { x: 1, y: 1 },
      },
    });
    viewLast.data(data);
    viewLast.interval().position("time*money");
    viewLast.option("slider", {});
    viewLast.on("afterpaint", () => {
      view1.changeData(viewLast.filteredData);
    });

    chart.render();

希望能帮助到你:)

posted by belldandy4ever over 2 years ago

基本同意 @belldandy4ever 的方案。 也可以通过 Apply 方法调用changeViewData方法达到同样目的。 源码里全是 this.view

chart.on(
      'slider:valuechanged',
      (ev) => {
        chart.getController('slider').changeViewData.apply(
          {
            view: mainView,
          },
          ev.event.value,
        );
      },
    );
posted by dcy0701 over 1 year ago

Fund this Issue

$0.00
Funded

Pull requests