Насколько я знаю, это невозможно с системой шаблонов Polymer: нет способа получить доступ к элементу, к которому применяется вычисленная привязка.
This
<a attributes={{appendAttributes(link)}}></a>
не может работать, потому что свойство attributes
только для чтения .
Я не могу связать их по одному, объявляя имя и значение атрибута вручную поскольку они являются заданными пользователем параметрами
На самом деле, если вы заранее знаете какие атрибуты / свойства должны быть установлены, вы все равно можете установить их динамически:
<a id=[[userGivenId]]
class$=[[userGivenClass]]
...
></a>
В любом случае, существует директива lit-html
, созданная open-wc
и называемая spread , которая делает то, что вы хотите. Для этого потребуется переписать ваш компонент с использованием LitElement примерно так:
import { LitElement, html, property, customElement } from 'lit-element';
import { repeat } from 'lit-html/directives/repeat';
import { spread } from '@open-wc/lit-helpers';
@customElement('my-element')
export class MyElement extends LitElement {
@property() userGivenId;
@property() links;
// ...
render() {
return html`
${repeat(this.links, link => html`
<a ...=${spread({
id: this.userGivenId,
'?my-boolean-attribute': true
'.myProperty': { foo: 'bar' },
'@my-event': () => console.log('my-event fired'),
})}
class="nav-item nav-link mr-md-2"
@click=${e => this.changePage(e)}
>${link.title}</a>
`)}
`;
}
}
С некоторыми ограничениями PolymerElement
s и LitElement
s могут сосуществовать в одном проекте, поэтому преобразование одного компонента не должно вызывать любая проблема.