Dựa trên nhận xét của bạn, có lẽ bạn nên thực hiện những gì mọi HTMLEuity khác khi tải tài sản thực hiện: làm cho nhà xây dựng bắt đầu một hành động tải, tạo ra sự kiện tải hoặc lỗi tùy thuộc vào kết quả.
Vâng, điều đó có nghĩa là sử dụng lời hứa, nhưng nó cũng có nghĩa là "thực hiện mọi thứ giống như mọi yếu tố HTML khác", vì vậy bạn đang ở trong một công ty tốt. Ví dụ:
var img = new Image();
img.onload = function(evt) { ... }
img.addEventListener("load", evt => ... );
img.onerror = function(evt) { ... }
img.addEventListener("error", evt => ... );
img.src = "some url";
điều này khởi động một tải không đồng bộ của tài sản nguồn, khi nó thành công, kết thúc onload
và khi nó sai, kết thúc onerror
. Vì vậy, làm cho lớp của riêng bạn cũng làm điều này:
class EMailElement extends HTMLElement {
constructor() {
super();
this.uid = this.getAttribute('data-uid');
}
setAttribute(name, value) {
super.setAttribute(name, value);
if (name === 'data-uid') {
this.uid = value;
}
}
set uid(input) {
if (!input) return;
const uid = parseInt(input);
// don't fight the river, go with the flow
let getEmail = new Promise( (resolve, reject) => {
yourDataBase.getByUID(uid, (err, result) => {
if (err) return reject(err);
resolve(result);
});
});
// kick off the promise, which will be async all on its own
getEmail()
.then(result => {
this.renderLoaded(result.message);
})
.catch(error => {
this.renderError(error);
});
}
};
customElements.define('e-mail', EmailElement);
Và sau đó, bạn thực hiện các hàm renderLoaded / renderError xử lý các lệnh gọi sự kiện và bóng dom:
renderLoaded(message) {
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<div class="email">A random email message has appeared. ${message}</div>
`;
// is there an ancient event listener?
if (this.onload) {
this.onload(...);
}
// there might be modern event listeners. dispatch an event.
this.dispatchEvent(new Event('load', ...));
}
renderFailed() {
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<div class="email">No email messages.</div>
`;
// is there an ancient event listener?
if (this.onload) {
this.onerror(...);
}
// there might be modern event listeners. dispatch an event.
this.dispatchEvent(new Event('error', ...));
}
Cũng lưu ý rằng tôi đã thay đổi id
thành a class
, bởi vì trừ khi bạn viết một số mã lạ để chỉ cho phép một phiên bản <e-mail>
phần tử của bạn trên một trang, bạn không thể sử dụng một mã định danh duy nhất và sau đó gán nó cho một loạt các phần tử.