- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 polymer 1.2.3 中,dom-repeat
是否可能?使用内容作为模板并将值绑定(bind)到提供的元素?
自定义元素:
<dom-module id="modify-collection">
<template>
<div>
<template is="dom-repeat" items="[[collection]]">
<content></content>
</template>
</div>
</template>
</dom-module>
<modify-collection collection="{{things}}">
<list-item resource="[[item]]"></list-item>
</modify-collection>
最佳答案
TLDR
解决方案 2 虽然有点冗长,但似乎效果最好。它还允许您动态选择模板,可能基于模型的属性。 (请参阅解决方案 2:高级示例)
背景故事
在这个简单的示例中发生了很多事情,包括模板化、在 shadow?、shady 和 light dom 之间“获取”内容,当然还有数据绑定(bind)。
这个问题提供了一些见解,但没有 Polymer 0.5's injectBoundHtml
这不是真的可行(Using template defined in light dom inside a Polymer element)。问题是当我们尝试使用 innerHTML 将元素复制到我们的模板时,我们的数据绑定(bind)似乎丢失了(AFAIK)。
因此,如果没有它,我们就无法使用数据绑定(bind)动态创建我们的模板。因此,两种解决方案都提前将内容包装在模板中;这导致 html 是惰性的,并允许 Polymer 在适当的时间进行数据绑定(bind) (http://www.html5rocks.com/en/tutorials/webcomponents/template/)。
如果您真的想了解所有内容,我建议您阅读 Polymer src
对于 lib/template/dom-repeat.html
, lib/template/templatizer.html
, lib/annotations/annotations.html
(约 1500 行)。
解决方案 1 -
见 btelle's answer below对于改进的解决方案 1。
请注意,这种方法会导致 dom-repeat
不自动渲染内容,所以我们手动调用渲染。
元素
<dom-module id="modify-collection">
<template>
<div>
<content></content>
<template id="repeater" is="dom-repeat" items="[[collection]]"></template>
</div>
</template>
<script>
...
ready: function() {
this.$.repeater.templatize(this.querySelector('#templ'));
}
_changeCollection: function(item) {
this.push('collection', item);
this.$.repeater.render();
}
</script>
</dom-module>
<modify-collection collection="{{things}}">
<template id="templ"><list-item resource="[[item]]"></list-item></template>
</modify-collection>
<template>
必须有
is="dom-template"
属性。
!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!--
Portions of this code have been adapted from the `grapp-template-ref` element.
The original copyright notices are below.
-->
<!--
MIT License
Copyright (c) 2014-2015 Dirk Grappendorf, www.grappendorf.net
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-->
<!--
The `dom-ref` element is a custom `HTMLTemplateElement` type extension that
can be used to reference another template by id using the `ref` property.
`dom-bindref` accepts a `bind` property to bind an object to the referenced
template. By default the bound object can be accessed as `item`, this can be
changed using the `as` property.
Example:
```html
<template is="dom-template" id="template-bind"><span>[[item.key]]</span></template>
<template is="dom-ref" ref="template-bind" bind='{"key":"value"}'></dom-ref>
```
-->
<!-- <link rel="import" href="templatizer.html"> -->
<script>
Polymer({
is: 'dom-ref',
extends: 'template',
/**
* Fired whenever DOM is added or removed by this template (by
* default, rendering occurs lazily). To force immediate rendering, call
* `render`.
*
* @event dom-change
*/
properties: {
/**
* Reference to another template's id.
*/
ref: {
type: String,
observer: '_refChanged'
},
/**
* Object to be bound to referenced template.
*/
bind: {
type: Object,
observer: '_bindChanged'
},
/**
* The name of the variable to add to the binding scope for the
* element associated with a given template instance.
*/
as: {
type: String,
value: 'item'
}
},
behaviors: [
Polymer.Templatizer
],
ready: function() {
this.templatize(this);
},
attached: function() {
return this._stamp();
},
detached: function() {
return this._removeChildren();
},
_refChanged: function(newRef, oldRef) {
if (oldRef) {
this._removeChildren();
return this._stamp();
}
},
_bindChanged: function(newBind, oldBind) {
if (oldBind) {
this._removeChildren();
return this._stamp();
}
},
_stamp: function() {
var root, template, templateRoot, bind = {};
this._parent = Polymer.dom(this).parentNode;
root = this._parent;
while (Polymer.dom(root).parentNode) {
root = Polymer.dom(root).parentNode;
}
template = Polymer.dom(root).querySelector("template#" + this.ref);
// Check For Light Dom Elements that may be passed to this shadow root (Useful for: `<content></content>`)
if (!template) {
template = root.host.querySelector("template#" + this.ref);
}
// Check the whole document
if (!template) {
template = document.querySelector("template#" + this.ref);
}
bind[this.as] = this.bind;
// templateRoot = template.stamp(bind).root;
// Use this method until this lands: https://github.com/Polymer/polymer/pull/1889
templateRoot = (new template.ctor(bind, template)).root;
this._children = Array.prototype.slice.call(templateRoot.childNodes);
return Polymer.dom(this._parent).insertBefore(templateRoot, this);
},
_removeChildren: function() {
var child, i, len, ref, results;
if (this._children) {
ref = this._children;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
child = ref[i];
results.push(Polymer.dom(this._parent).removeChild(child));
}
return results;
}
}
});
</script>
<dom-module id="modify-collection">
<template>
<div>
<content></content>
<template is="dom-repeat" items="[[collection]]">
<template is="dom-ref" bind="[[item]]" ref="templ"></template>
</template>
</div>
</template>
</dom-module>
<modify-collection collection="{{things}}">
<template id="templ" is="dom-template"><list-item resource="[[item]]"></list-item></template>
</modify-collection>
<dom-module id="modify-collection">
<template>
<div>
<content></content>
<template id="wrapper" is="dom-template">
<div class="overlay">
<template is="dom-ref" bind="[[item]]" ref="templ"></template>
</div>
</template>
<template is="dom-repeat" items="[[collection]]">
<template is="dom-ref" bind="[[item]]" ref="[[_templateRef(_overlayMode)]]"></template>
</template>
</div>
</template>
<script>
...
properties: {
_overlayMode: {
type: Boolean,
value: false
}
},
_templateRef: function(overlayMode) {
return overlayMode ? 'wrapper' : 'templ';
}
</script>
</dom-module>
关于 polymer Dom-Repeat 绑定(bind)到内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645114/
我有一个Polymer元素,并且在它的Javascript中,我试图找到它的宽度和高度,就像它在DOM中一样。我尝试了很多方法,但总是得到0。 最佳答案 ...这是对我有用的一个: 将Polymer.
如何在“polymer 3”元素中使用“polymer 2”元素?由于元素在shadow dom内部不起作用,因此以下内容不起作用。 static get template() { retur
在我的 React 项目中,我使用 ES6 模块已有一段时间了。在我的 React 组件中,我将使用 import: import {f1,f2} from "./myLib"; 在我的 polyme
我想知道是否有用于聚合物元素的CDN,因为您必须始终下载元素,并且通过CDN导入它会更方便。在Google上找不到任何内容?还有什么理由不存在它,或者仅仅是因为它太新了? 最佳答案 我现在不知道任何托
我试图在以下取自 Polymer Path 的上下文中理解主机和目标(和元素)和 Polymer Data Flow文档。 考虑下图: 现在考虑以下语句(来自同一个 documentation ):
polymer 文档具有以下两种方式绑定(bind)示例: Polymer({ is: 'custom-element', properties:
如果我想从具有聚合物的数组中创建纸张选择器,则看起来很麻烦: ... [[item
我最近安装了 nodejs,凉亭。然后,我使用以下命令安装了 polymer : npm install -g polymer 然后,我添加了 polymer 安装路径: C:\Users\\AppD
我正在尝试通过 querySelector 或等效方法获取在另一个元素中定义的自定义 Polymer 元素。我的代码如下: Polymer({ ready: function(){
我正在使用 Polymer v3 开发一个 Web 组件,并且需要在我的新组件的模板 HTML 中包含一些在旧式 Polymer 2 组件中定义的自定义元素。 由于 Polymer 3 不再支持 HT
我有两个 polymer 元件: 它们都是父元素内的子元素 ,并且每个都位于不同的文件中。 在 ,我有一个 ,里面有一些在那里通过点击事件来获取它的值。 目标是:在 另一方面,我想从具有如下 ur
任何人都可以向我指出使用 Polymer CLI 中的 Polymer 2 和 polymer-build 的教程吗?当我使用 polymer-starter-kit 中的任何示例并使用 polyme
我需要知道何时可以开始以编程方式使用我的自定义 Polymer 元素。元素还在undefined即使在我的 window.onload处理程序。是否有使用 Polymer 1.0 正确执行此操作的既定
我正在使用 Polymer Starter Kit 作为应用程序的基础。所以,这是一个路由到特定部分的单页应用程序。我的索引基本没变,你看这里https://github.com/PolymerEle
polymer 菜鸟... 我正在尝试根据 Polymer API 文档创建一个自定义元素,我的主页如下所示: Polymer
我在迁移到 Polymer 1.0 时遇到了一些问题 我的主要问题是“style-scope”和“my-element”类被应用于元素中的每个子节点。使用这样的东西时这不是问题:
图片中显示 People also search for 的部分,有一个可滚动的水平项目列表。我必须使用 polymer 做同样的事情,但找不到任何类似的东西。我已经实现了垂直列表,但不确定水平列表。
我想创建一个用户只能实例化一次的元素。 到目前为止,我能想到的最好的做法是在匿名函数中定义元素,并在发现该元素已存在时抛出错误。有没有办法让它拒绝被创建? (function(){ var sin
我有一个简单的元素,它只允许您一次选择一个本地文件,然后将所选文件显示为您可以删除的项目,如下所示: 该组件本身工作得很好,问题是我在同一页面中有另一个相同类型的组件,但在不同的父元素(和隐藏)内。如
我正在深入研究 Polymer 1.0 元素,我对计算的属性有点好奇。 例如,在 纸抽屉面板.html , … … … Polymer({ is: 'paper-
我是一名优秀的程序员,十分优秀!