Перераспределить повторяющиеся элементы слота во вложенной теневой DOM

Справочная информация: этот вопрос относится к разработке расширения для последних версий Chrome. Он опирается на функции javascript, такие как импорт HTML и пользовательские элементы, которые доступны не во всех браузерах, но это нормально для этого случая.

Я пытаюсь реализовать пользовательский элемент HTML, упрощенный следующим образом:

<custom-el>
    <span slot="head">Great</span>

    <span slot="item">Item one</span>
    <span slot="item">Item two</span>

    <span slot="foot">done</span>
</custom-el>

Я регистрирую <custom-el>, Каждый раз, когда элемент создается, класс пользовательских элементов моего кода присоединяет теневой корень и добавляет к содержимому теневого корня следующий шаблон:

<template id="main">
    <h1><slot name="head"></slot></h1>
    <ul>
        <slot name="item"></slot>
    </ul>
    <i><slot name="foot"></slot></i>
</template>

Я хотел бы перераспределить каждый <span> с атрибутом slot="item" на вторичный шаблон, отвечающий за визуализацию отдельного элемента:

<template id="sub">
    <li><slot name="item"></slot></li>
</template>

Количество слотов с атрибутом name="item" не исправлено Он генерируется из базы данных и регулярно меняется.

Я понимаю, что слот можно перераспределить, подключив shadowRoot к родительскому элементу слота и установив атрибут слота слота, например <slot name="item" slot="newItem">, Но я не думаю, что это будет работать в моем случае, так как суб-шаблон должен обернуть каждый экземпляр элемента, а не список элементов.

Я мог бы прикрепить теневые корни и суб-шаблоны к каждому элементу в основном документе. Это будет работать, но я предпочитаю, чтобы основной шаблон импортировал и применял любые вложенные shadowRoots и шаблоны. Таким образом, первичный документ должен только импортировать файл, содержащий основной шаблон. Реализация деталей компонента инкапсулирована в основной HTML-файл шаблона.

Я также мог бы использовать slotchange событие и HTMLSlotElement.assignedNodes метод, чтобы собрать воедино решение сценариев. Но я бы предпочел не идти по этому пути.

Есть ли другой подход? Мой фактический вариант использования включает более сложную структуру HTML. Или, может быть, моя архитектура или понимание веб-компонентов неверно?

1 ответ

Самый простой подход, если это возможно, это добавить элементы с <li> тег в свете DOM.

<span slot=item><li>Item 1</li></span>
<span slot=item><li>Item 2</li></span>

Таким образом, вам не нужно использовать Javascript для генерации <li> теги.

Другие вопросы по тегам