Ich verwende dieses polyfill ein eigenes Element in JavaScript zu implementieren. Die self
Variable bezieht sich jedoch auf Window
innerhalb meiner Methoden, wenn ich zuerst const self = this
aufrufen.Verweis auf sich selbst (dieser) innerhalb CustomElement
Kann jemand freundlicherweise erklären, warum das ist für mich und vielleicht einen besseren Weg vorschlagen, die benutzerdefinierten Elementinstanz innerhalb von Methoden zugreifen?
class DocumentPreview extends HTMLElement {
constructor(self, documents) {
self = super(self);
self.documents = documents || [];
self.innerHTML = Handlebars.templates['document_preview']();
}
connectedCallback() {
// if I don't do this first ...
const self = this; // <<----------------------------------
console.log("connected now");
document.addEventListener('mqttsub', function(event) {
// ... onMessage is undefined here:
self.onMessage(event.detail);
});
}
disconnectedCallback() {
console.log("disconnected");
}
onMessage(message) {
// Same story ...
const self = this; // <<----------------------------------
Promise.resolve(true)
.then(json("/documents/"))
.then(ds => ds
.filter(x => x.name==message.payload)
.reduce((x, y) => y, undefined)
)
.then(d => json(sprintf("/document/%d/", d.id))())
// ... here:
.then(d => self.renderDocuments(d))
.catch(console.log);
}
renderDocuments(d) {
console.log('render', d);
}
}
Die 'self' Parameter im Konstruktor nicht auf andere Methoden zugänglich sein würden, das ist ein Grundumfang Thema. Wenn Sie Pfeilfunktionen wie in 'onMessage()' verwenden, brauchen Sie die 'self' Variable nicht, Sie können' this' direkt verwenden. Für eine Nicht-Pfeil-Funktion wie in Ihrem Event-Listener-Callback können Sie entweder tun, was Sie gezeigt haben oder '.bind (this)' mit diesem Callback verwenden und dann 'this' anstelle von' self' im Callback. – nnnnnn