【问题标题】:Dynamically injecting a template in Polymer 1.0在 Polymer 1.0 中动态注入模板
【发布时间】:2015-06-20 15:07:05
【问题描述】:

我正在尝试将<template> 以正确的方式注入并显示到 Polymer Web 应用程序中,但我遇到了一些困难。 (……或者我误解了 1.0 文档?)

documentation about manipulation the DOM 说:

Polymer 提供了用于操作 DOM 的自定义 API,以便正确维护本地 DOM 和轻量级 DOM 树。这些方法和属性与其标准 DOM 等效项具有相同的签名,只是返回节点列表的属性和方法返回的是 Array,而不是 NodeList。

注意:所有 DOM 操作都必须使用此 API,而不是直接在节点上使用 DOM API。

所以我想我必须在任何地方使用Polymer.dom API 来操作 DOM,这对我来说很有意义,因为这样 Polymer 可以与生成的 shady DOM 保持同步。没有DOM.appendChild(),而是Polymer.dom().appendChild()。直接操作 shady DOM 也不是一个好主意……还是会这样?

想象一个简单的页面结构:

<body>
  <template is="dom-bind" id="app">
    <main>
      <template is="dom-bind" id="content">
        <p>Lorem ipsum dolor sit amet.</p>
      </template>
    </main>
  </template>
</body>

还有第二个小sn-p,我可以将其导入页面。

<template id="snippet">
  <p>Consectetur adipisici elit.</p>
</template>

此模板应替换/引用为#content。那么,让我们开始吧。

导入 sn-p 很容易。我可以获取它并获取它的 DOM 元素。

Polymer.Base.importHref('/snippet', function(e) {
  // on success: imported content is in e.target.import

  var template = Polymer.dom(e.target.import).querySelector('#snippet');
  // until here it works, `template` is the template from my snippet
  ...

现在我想我必须将其附加到我的template#app 并将template#contentref 更改为content...如果仍然支持更改ref?我该怎么做?无论我如何处理,我每次都会卡住。

var app = Polymer.dom(this).querySelector('#app'); // Works, is template#app
var app = document.querySelector('#app'); // Same result

Polymer.dom(app).appendChild(template); // will append it, but outside of the document fragment
Polymer.dom(app.root).appendChild(template); // won't do anything

Polymer.dom(app).querySelector('template'); // undefined
Polymer.dom(app.root).querySelector('template'); // undefined
app.querySelector('template'); // undefined

我研究了数小时和数天,试图找到解决方案。它适用于标准 DOM API,但我认为这不是正确的方法。如果有人能解决我的困惑,那就太好了。

编辑: 或者Polymer.dom(this) 会这样做,我不需要打电话给Polymer.dom(app)?但是,我再次尝试了它,它不会工作。啊啊啊,真是太混乱了。

【问题讨论】:

  • 您的用例到底是什么?例如,您的#snippet 不能是&lt;div&gt; 标签有什么原因吗?顺便说一句,我认为目前在 Polymer 1.0 中没有直接替代 ref 的方法。此外,如果您尝试强制将数据绑定模板插入 DOM,您可能会很不走运,因为 github.com/Polymer/polymer/issues/1778 不支持它。
  • 我在 Google I/O Webapp 中看到过这个过程,它看起来很干净。您只需在文档末尾附加一个模板,然后在其他地方引用它——繁荣,它就会显示出来。但是 I/O Webapp 使用 v0.8(甚至是 v0.5?)。太可惜了,这不再受支持了。
  • 我认为我的问题/困惑是新的 shady DOM 将 Web 组件置于 Shadow DOM 之外,我不知道 wherehow 操纵它。对我来说,操作原始 DOM 是合乎逻辑的,Polymer 保持 shady DOM 与它同步。但是使用Polymer.dom() 我最终会操纵阴暗的 DOM,感觉很脏。
  • here。似乎无法添加模板引用支持,直到可以更新基本 API 以支持在实例时动态添加绑定。所以,我想这与为什么这相当困难有关。
  • 我的用例是将自定义模板从外部注入到复杂的迭代自定义元素中。我认为这很常见?考虑一个元素进行数据库查询并呈现它。我想自定义格式..我错过了什么吗?

标签: polymer polymer-1.0


【解决方案1】:

如果我理解正确并且您想将模板插入到本地 dom(将其插入其他地方并没有真正意义),那么它就是 Polymer.dom(this.root).appendChild

来自https://www.polymer-project.org/1.0/docs/devguide/local-dom.html#dom-api:为了插入/追加到自定义元素的本地dom,使用this.root作为父元素。

【讨论】:

  • 谢谢!我一直认为我需要将它添加到模板标签并将&lt;template&gt; 作为我的“shady-DOM-root”。是的,现在将它插入真正的 dom-root 对我来说也很有意义。 :) 目前我不再使用 Polymer,因此无法对其进行测试——但这似乎是一个合适的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多