【问题标题】:How do I use querySelector inside a class?如何在类中使用 querySelector?
【发布时间】:2014-07-20 22:03:59
【问题描述】:

我认为我对飞镖缺乏基本的了解,但基本上我想做的是这样的:

void main() {
  new MyClass();
}

class MyClass {

  MyClass() {
    CanvasElement canvas = querySelector("#myCanvas");
    CanvasRenderingContext2D context = canvas.context2D;
  }
}

但是,当我尝试获取上下文时,canvas 是一个空对象。我怎样才能在课堂上做到这一点。另外,我不想这样做:

void main() {
  CanvasElement canvas = querySelector("#myCanvas");
  new MyClass(canvas);
}

class MyClass {
  CanvasElement canvas
  MyClass(this.canvas) {
    canvas = this.canvas;
    CanvasRenderingContext2D context = canvas.context2D;
  }
}

因为我需要能够在课堂上完全做到这一点。这不是飞镖的工作原理,还是我遗漏了什么?

【问题讨论】:

    标签: dart dart-html


    【解决方案1】:

    您是否尝试过第二个示例?如果您从 main() 或在班级内调用 querySelector 并没有什么不同。

    你使用 Angular 还是 Polymer? Angular 或 Polymer 组件引入了 shadowDOM。 querySelector() 不会跨越 shadowDOM 边界,因此它不会在元素 shadowDOM 中找到元素。

    要查询 shadowDOM 中的元素,您可以查询该组件,然后您可以继续搜索。

    querySelector("somecomponent").shadowRoot.querySelector("someothercomponent").shadowRoot.querySelector("#myCanvas");
    

    您必须确保包含所有 shadowDOM 的 DOM 都已完全构建,然后才能查询它们。 如果您从组件中运行代码,请将您的代码发布到 onShadowRoot 方法中(有关详细信息,请参阅 NgComponent ready event

    【讨论】:

    • 哇,你说得对,我的立场是正确的。你也是对的,我之前使用过 Angular,这让我相信了这一点,但事实证明我只是在我的代码中搞砸了一些东西。既然不推荐使用 shadow dom,你知道我将如何在 Angular 中实现这种效果吗?
    • 我不确定您所说的 shadow dom is deprecated 是什么意思。我猜你的意思是shadow_dompub.dartlang.org/packages/shadow_dom。这只是包含 shadowDOM polyfill 的包,适用于没有本机支持的浏览器。 polyfill 已添加到 web_components 包中。
    • 啊,我明白了……但是你为什么不能只与常规 DOM 交互呢?
    • Angular 组件或 Polymer 元素(或自定义元素)的 shadowDOM 是元素的内部实现(例如 <video> 标签)。它就像一个黑匣子。您使用它但不关心它的实现细节。它是故意这样设计的,以允许封装。当您使用 3rd-party 元素时,您不希望它破坏您的应用程序,因为它的任何内部 HTML 都使用与您添加到页面的其他标签相同的 id。如果您绝对愿意,shadowRoot 允许您访问元素实现。
    • 谢谢,你是我的英雄!
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2017-01-18
    • 2021-05-22
    • 1970-01-01
    • 2023-02-17
    相关资源
    最近更新 更多