私はこのpolyfillを使ってJavaScriptでカスタム要素を実装しています。しかし、私がconst self = this
を最初に呼び出さない限り、self
変数は私の方法の中でWindow
を参照します。CustomElement内のself(this)への参照
私はそれがなぜ私のものであるのかを親切に説明し、おそらくメソッド内のカスタム要素インスタンスにアクセスするより良い方法を提案できますか?
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);
}
}
コンストラクタの 'self'パラメータは他のメソッドからアクセスできませんが、それは基本的な範囲の問題です。 'onMessage()'のようにarrow関数を使用している場合、 'self'変数は必要ありません。' this'を直接使うことができます。あなたのイベントリスナーのコールバックのような非矢印関数の場合、あなたが表示したことをするか、そのコールバックで '.bind(this)'を使い、コールバックの中で 'self'ではなく' this'を使います。 – nnnnnn