【问题标题】:Dynamically import HTML template in Dart Polymer在 Dart Polymer 中动态导入 HTML 模板
【发布时间】:2014-11-13 03:19:08
【问题描述】:

我已成功使用 dart 动态创建聚合物组件并添加到 dom。

但现在我想这样做无需在编译时静态导入 HTML 模板。

在我的用例中,我有一个 ID 为 myContainer 的 div 容器和一个标签为 my-tag 的自定义 Polymer Dart 组件。

我试过了:

LinkElement e = new LinkElement('link');
e.rel = 'import';
e.href= 'my-tag.html';
document.head.children.add(e);

$['myContainer'].children.add(new Element.tag('my-tag'));

但这最终会出现以下异常:

Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': Nodes of type 'HTML' may not be inserted inside nodes of type '#document'. 
...

请注意,将聚合物元素添加到 dom 时会引发异常,而不是在添加链接标记时引发异常。如果在编译时添加链接并注释在运行时添加它的代码,同样的代码也可以工作。

我也尝试了上面代码的几种不同变体,主要是在polymerInit 之前或polymerInit().run(...) 内部调用的单独方法中添加链接标记,但没有任何变化。

我想知道这个用例是否受支持。

【问题讨论】:

  • 为什么不想静态添加导入?我认为 Polymer 变压器在您构建项目时需要它们。
  • 因为我想创建一个组件库,当用户单击时,导航框架会在内容区域中显示该组件库。我已经需要从“导航器”的飞镖端导入每个组件,但这还不错,因为我需要注册“路线”。但我试图找到一种方法,不在 HTML 端包含 HTML 模板,并尽量减少添加新“页面”所需的工作。
  • 你可以创建一个转换器。
  • @GünterZöchbauer 听起来很有趣。你能扩展这个概念吗?
  • 我还没有建造变压器的经验。转换器由pub buildpub serve 执行,可以在构建过程中分析和修改代码。 dartlang.org/tools/pub/assets-and-transformers.html, dartlang.org/tools/pub/transformers

标签: dart polymer dart-polymer


【解决方案1】:

也许可以创建一个可以做到这一点的转换器。 转换器由 pub build 和 pub serve 执行,可以在构建过程中分析和修改代码。 dartlang.org/tools/pub/assets-and-transformers.html, dartlang.org/tools/pub/transformers

(我没有尝试过,但我认为它会起作用)
您可以创建一个 HTML 文件,其中包含您的包所需的所有导入,并且您的包的用户只需要导入这个文件。

【讨论】:

  • 创建一个导入所有其他文件的 html 文件不起作用。但变压器的方式听起来很有趣,我会调查一下。
  • 我认为这就是 Dart core-elements 和 paper-elements 所看到的,例如 github.com/dart-lang/core-elements/blob/master/lib/…
  • mmh。不确定在这种情况下是否需要 core_selector 的导入(在私有实现中重复),该模板中使用了另一个导入(实际上它是模板),这不像导出以在另一个文件中使用。跨度>
  • 但是当您在 Polymer.dart 应用程序中使用此元素时,您只需导入此文件。
  • 好的,当然,有一个 html 文件可以导入所有其他作品。可能我歪曲了一些东西。我将使用该解决方案一段时间,但我会更深入地研究 transformer 选项。
【解决方案2】:

尝试添加一个 HeadElement:

 LinkElement e = new LinkElement();
 e.rel = 'import';
 e.href= 'my-tag.html';
 HeadElement h = new HeadElement();
 h.children.add(e);
 document.head.children.add(h);

【讨论】:

  • 你真的需要HeadElement吗?我原以为你可以做到document.head.append(new LinkElement()..rel = 'import'..href='my-tag.html');。这在构建到 JavaScript 时也有效吗?
  • @JoaoBiriba 我会尝试,但我已经可以告诉你这个事实:即使没有(重新)添加 head 元素(它已经存在于文档中),通过使用 chrome 检查 dom 我注意到实际添加了链接元素,并且仅当我尝试将组件添加到dom而不是添加链接标签时才会触发异常。另一方面,如果我“手动”添加链接标签,它可以工作。
  • 内置js给出相同的结果,但是你的解决方案更干净,不确定他是否真的需要HeadElement。
  • 另一个“有趣”的事实是,通过检查 DOM,我可以在添加链接后看到链接内部的“shadowDom”。此行为与“在编译时”添加链接时不同。在后一种情况下,您可以看到链接标签在某种程度上被 Polymer 引擎“吃掉”了,不再出现在头部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2017-10-21
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多