【问题标题】:Dynamically created templates with Polymer in a Chrome app在 Chrome 应用中使用 Polymer 动态创建模板
【发布时间】:2014-11-03 13:08:12
【问题描述】:

我正在开发一个需要做两件主要事情的 Chrome 应用程序:

  1. 根据连接设备提供的字段和数据类型列表自动生成 UI。
  2. 允许用户为 UI 定义和共享他们自己的演示文稿,并在连接设备时自动应用该演示文稿。

我正在使用 Polymer,我认为实现 #2 的最佳方法是使用用户提供的 Polymer 元素。然后,我可以简单地将设备中的变量绑定到 UI,用户的模板可以确定如何显示和设置样式。

因此,实现#1 是从输入模式自动生成聚合物元素的问题。这与通常的方法有些不同,我可能会为每种类型的小部件定义一个带有条件子模板的重复模板。

那么,我的问题是:

  1. 如何在不违反 Chrome 应用程序的 CSP 且不引入重大 XSS 问题的情况下从远程源动态评估聚合物元素/模板? (希望前者能保护我免受后者的伤害?)
  2. 为 Polymer 元素动态生成标记的最简单方法是什么?我可以定义一个元模板并使用生成的标记吗?

【问题讨论】:

标签: javascript polymer google-chrome-app content-security-policy


【解决方案1】:

我不完全确定为什么要排除使用带有(诚然复杂的)<template> 逻辑的预定义 Polymer 元素,但如果您确定需要动态并生成元素的内容在仍然使用 Polymer 的数据绑定的同时,injectBoundHTML() 可能就是您想要的。

很遗憾,目前没有记录,但在open issue tracking the documentation 中有如何使用它的示例。

您可以从任何来源获取“绑定”的 HTML,虽然我不是 CSP 方面的专家,但我认为这不会引发任何额外的 CSP 考虑。

【讨论】:

  • 我排除它的唯一原因是因为我希望能够生成一个默认模板,然后用户可以为他们的特定设备进行编辑 - 而不是必须从头开始编写一个来执行任何完全自定义。
  • 我有点不清楚是否/何时需要injectBoundHTMLdynamic imports 上的 Polymer 手册部分显示了一种使用 Javascript 注入元素的方法,它似乎没有进行任何特殊处理来升级元素。什么时候需要,什么时候不需要?
  • 我没怎么玩过动态导入,但我想这是另一种选择,是的。从理论上讲,您可以拥有一堆不同的 HTML 文件,每个文件对 <custom-element> 的定义都不同,然后为每个用户导入适当的 HTML 文件。这只是使用单个“shell”元素定义的不同方法,其影子 DOM 在运行时通过网络获取和injectBoundHTML() 填充。
  • 对不起,我实际上是想链接到imperative registration,这表明简单地设置innerHTML似乎足以让Polymer识别新元素——这让我想知道你为什么需要injectBoundHTML完全没有。
  • 我相信.innerHTMLinjectBoundHTML() 之间的主要区别在stackoverflow.com/questions/25433389 中有介绍,并且与动态修改现有元素而不是注册新元素有关。如果你想注册新元素,那么动态导入或设置.innerHTML 可能会起作用。
猜你喜欢
  • 1970-01-01
  • 2020-09-16
  • 2012-10-02
  • 2014-11-13
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2013-03-22
相关资源
最近更新 更多