Кажется, что connectedCallback
не может получить доступ к другим элементам по отношению к себе, когда он еще не проанализирован. Этот вид имеет смысл, если учесть, что пользовательский элемент должен иметь возможность жить в любом месте в DOM, не будучи зависимым от другого элемента. Таким образом, если бы не было родительского элемента, который должен быть выбран, элемент, вероятно, не будет работать должным образом.
Способ сделать это - изменить метод render
для получения аргумента, который будет динамически устанавливать свойство tracklist
к пользовательскому элементу. Затем выберите элемент my-element
в DOM и найдите section
.
. Затем используйте метод customElements.whenDefined
, чтобы соединить section
и my-element
вместе всякий раз, когдаПользовательский элемент готов. Этот метод возвращает Обещание, которое разрешается всякий раз, когда определяется пользовательский элемент, и дает вам возможность выполнить обратный вызов.
См. Пример ниже:
// Do something whenever the element is ready.
window.addEventListener('load', function() {
// Wait for the document to load so the DOM has been parsed.
window.customElements.whenDefined('my-element').then(() => {
const myElement = document.querySelector('my-element');
// Only do something if the element exists on the page.
if (myElement !== null) {
const tracklist = myElement.closest('section');
myElement.render(tracklist);
console.log(myElement.tracklist);
}
});
});
// Create element.
class myElement extends HTMLElement{
constructor() {
super();
this.tracklist = null;
}
render(tracklist){
this.tracklist = tracklist;
// following code requires this.tracklist!
// ...
}
}
// Define element.
window.customElements.define('my-element', myElement);
<section>
<my-element></my-element>
</section>
Если у меня возникли вопросы или у вас есть вопросы, пожалуйста, дайте мне знать.
Хорошего дня!