8

我从一些 Dart 示例开始。然后我想用这里document.query('#someId')描述的方式查询 DOM ,但文档中似乎没有查询方法。通过 `new Element.tag('p') 创建新元素也不起作用。

然后我发现它会起作用,当我将导入的包从 更改dart:domdart:html. 但是同时使用它们会给我带来一堆duplicate definition of _XYZ.

所以我想知道:

  1. dart:htmldart:dom包有什么区别
  2. 我应该使用哪一个
  3. 为什么我不能同时使用
4

4 回答 4

10

回答有点乱

  1. 我应该使用哪一个:你应该使用dart:html它在 DOM 之上提供最干净的抽象。

  2. 为什么我不能同时使用两者:严格来说不需要它,但是您实际上可以通过使用此处描述的肮脏黑客来获得底层dart:dom实现。更好和更干净的解决方案是使用 Dart 重命名导入的能力,即如下面的@munificent所述。dart:html#import('dart:dom', prefix: 'dom');

  3. dart:html 和 dart:dom 包有什么不同。我倾向于认为它们之间的区别类似于 JQuery ( dart:html) 与 JS DOM 操作 ( dart:dom)。

Dart 团队正在努力使dart:htmlAPI 像我们从 JQuery(dom 操作)、Tree.js(WebGL 编程)和D3(SVG 绘图)等库中习惯的那样简单且不令人惊讶(以良好的方式)使用)。此外,他们还尝试在所有这些功能领域遵循一种 API 样式,以便 SVG 或 WebGL API 使用与 DOM API 类似的结构,从而确保所有部分都能很好地协同工作。

更新:截至 2012 年5 月, dart:dom 现已弃用并将被删除。

于 2012-01-22T13:39:22.830 回答
7

拉斯在你的问题上做得很好。我将添加到:

为什么我不能同时使用

事实上,你可以。问题是两个库在一些事情上使用相同的名称(主要是window)。当您同时导入它们时,这些名称会发生​​冲突,这是 Dart 不允许的。要解决此问题,您可以使用前缀导入其中一个:

#import('dart:html');
#import('dart:dom', prefix: 'dom');

然后,当您引用从 导入的名称时dart:html,您只需使用该名称。当你想要一个 DOM 时,你可以为其添加前缀:

window     // dart:html window
dom.window // dart:dom window
于 2012-01-23T21:05:06.893 回答
6

所有答案的更新,并且可能使这个问题不再适用的是 dart:dom 已被弃用。

请参阅dartlang 网站上的这篇文章。

于 2012-05-04T13:02:46.510 回答
0

添加到已经给出的优秀答案的简短答案:尽可能使用 dart:html。必要时使用 dart:dom(必要时输入错误)。

于 2012-01-25T01:18:28.660 回答