Polymer loop through an array of elements to be stamped - polymer

Is there anyway for me to do the following:
<template is="dom-repeat" items="[[blocks]]">
<[[item]]></[[item]]>
</template>
using an array of elements such as: ['my-element1','my-element2','my-element3']
I appreciate the help.

You cannot construct your tags in that way, however there's been this hack around for a while:
<template is="dom-repeat" items="{{blocks}}">
<div inner-h-t-m-l={{item}}></div>
</template>
and have array contain:
['<my-element1></my-element1>','<my-element2></my-element2>','<my-element3></my-element3>'].
Although I'd rather avoid this method, because it hinders communication between elements and I would go with regular JS for element creation.

Related

Can I use a Template DOM repeater based on the number of child elements of <contents>

I was contemplating some code which would wrap each child of of the web component. Something like:
<dom-module id=test">
<template>
<template is="dom-repeat" items="{{contents.children}}">
<div>
{{item}}
</div>
</template>
</template>
</dom-module>
so what would happen is if i did something like:
<test>
<span>foo</span>
<span>bar</span>
</test>
it would kick out:
<test>
<div><span>foo</span></div>
<div><span>bar</span></div>
</test>
I was looking over ways i could do this, but i am having issues trying to create the dom-repeat correctly since contents.children isnt a real property.
Edit i was looking at what attributes are allowed for content tags, which is select plus all globals.
So in theory, i could assign an ID and then get the children of it?
<content id="myContent"></content>
and then in the dart say:
ContentElement get _content => $['myContent'];
#property HtmlElement children = [];
a.created(): super.created(){
set("children", _content.children);
}
and then mark the template accordingly?
<template is="dom-repeat" items="{{children}}">
...
</template>
It looks like you would like to wrap certain elements and add some new functionality to them.
The simplest (and most Polymer-ish) way to do that, is to introduce another custom element, which is (only) responsible for the wrapping.
Your test element (which, by the way, has an incorrect name - the name must contain a dash) would then look like this:
<dom-module id=test-element">
<template>
<content></content>
</template>
</dom-module>
(I fixed the naming according to convention. Renamed from test to test-element.)
And the newly created wrapper element (named wrapper-element) should look something like this:
<dom-module id=wrapper-element">
<template>
<div><content></content></div>
</template>
</dom-module>
Everything put together, the usage would be something like this:
<test-element>
<wrapper-element><span>foo</span></wrapper-element>
<wrapper-element><span>bar</span></wrapper-element>
</test-element>
With this, you get a clean solution, where you don't even need any JS code for the wrapping logic.

Polymer issue with dropping a value into an attribute

So I have been trying to put together a custom storage element with Polymer which uses the polymer-localforage element inside it. The local forage element requires that you set it's name attribute and so I thought that I could simply pass the "name" attribute or "id" attribute from my custom element over to the local forage element in my template, but it doesn't work. To make sure I wasn't doing something wrong I did a custom element which just inserts the "name" attribute of the root into the "name" attribute of a div inside the template tag but that doesn't work either.
<dom-module id="x-custom">
<template>
<div name="{{name}}">Hello {{name}}</div>
</template>
</dom-module>
and the script
Polymer({
is: 'x-custom',
properties:{
"name": {
type: String
}
}
});
if I use the element
<x-custom name="foo" />
What I then get is
<div class="style-scope x-custom">Hello foo</div>
No name attribute at all, not even a blank one.
How can I drop a template value into an attribute of a child element?
Try adding $ at the end of attributes as below.
<dom-module id="x-custom">
<template>
<div name$="{{name}}">Hello {{name}}</div>
</template>
</dom-module>
The Polymer docs refer to this as annotated attribute binding.

Using custom data-* attributes inside HTML5 <template> tag

I'm building a menu with a dom-repeat template like this:
<template is="dom-repeat" items="{{appletsMenu}}">
<a data-route="{{item.dataRoute}}" href="{{item.href}}">
<iron-icon icon="{{item.icon}}" src="{{item.iconSrc}}" ></iron-icon>
<span>{{item.name}}</span>
</a>
</template>
The data-route attribute is not filled though in the generated DOM:
...
...
It seems that the template only renders "normal" attributes like href. Am I'm missing something? Thanks.
To bind to an attribute, use $= rather than =. This results in a call to:
element.setAttribute(attr, value);
As opposed to:
element.property = value;
(source)
So in your case:
<a data-route$="{{item.dataRoute}}" href="{{item.href}}">

Insert data-bound HTML into standalone auto-binding template

It is documented that you can override Polymer's data binding default behavior of escaping HTML by using the injectBoundHTML method.
That's fine for some use cases, but is there a way to prevent HTML escaping for just standalone templates?
For example, I have a template in the <body> of my HTML page that looks like this; how can I prevent the HTML of the myHTMLsnippet value from being escaped?
<template is="auto-binding">
<div>{{myHTMLsnippet}}</div>
</template>
I was able to find a workaround by nesting the juicy-html element inside the auto-binding template.
<template is="auto-binding">
<div>
<template is="juicy-html" content="{{myHTMLsnippet}}"></template>
</div>
</template>

When using Polymer Web Components is it possible to bind data in the markup?

Let's say I have something like:
<code>
<polymer-element name'my-element'>
<template>
<div>{{label}}</div>
</template>
</polymer-element>
</code>
Would it be possible for me to simply declare my element this way:
<code>
<my-element label='name'></my-element>
</code>
What I'm doing doesn't seem to work. Is there a straightforward way to bind in the markup?
There are a few issues with what you posted, you are missing an '=' after 'name' in your polymer-element, and you have to either call Polymer to register my-element or include noscript attribute.
In general, if you construct your question in JsBin (or similar) you can make sure you've resolved such issues which otherwise obscure the nature of your question.
Bottom line is that you must make label a published property before Polymer will automatically connect it to attributes. You can make it published by including the name in the attributes attribute of the polymer-element, like this:
<polymer-element name="my-element" attributes="label" noscript>
http://jsbin.com/kizahi/1/edit
<my-element label="name"></my-element>
<polymer-element name="my-element" attributes="label" noscript>
<template>
<div>{{label}}</div>
</template>
</polymer-element>