Я попытался загрузить JSON файл внутри класса js. Загруженные данные доступны внутри функции.
class MakePage {
constructor() {
var request=new XMLHttpRequest();
request.open('GET','daten.json');
request.responseType='json';
request.send();
request.onload=function() {
this.daten=request.response;
alert(this.daten[1].Name); // this works
}
}
test(name) {
document.getElementById(name).innerHTML=this.daten[1].Name;
}
}
page=new MakePage();
page.test("xyz"); // TypeError: this.daten is undefined
Как сохранить загруженные данные в члене класса?
EDIT: Спасибо за ответы. Я попробовал self = this, bind (this) и оператор стрелки, но всегда получаю ту же ошибку TypeReference.
Просто замените функцию обратного вызова функцией стрелки. Когда вы это сделаете:
this.daten=request.response
this
не то, что вы думаете.) Использование функции стрелки не изменит значение this
и на самом деле это будет то, что вы ожидаете.
class MakePage {
constructor() {
var request=new XMLHttpRequest();
request.open('GET','daten.json');
request.responseType='json';
request.send();
request.onload = () => {
this.daten=request.response;
alert(this.daten[1].Name); // this works
}
}
test(name) {
document.getElementById(name).innerHTML=this.daten[1].Name;
}
}
Другой способ сделать это - использовать bind
.
request.onload=function() {
this.daten=request.response;
alert(this.daten[1].Name); // this works
}
request.onload = request.onload.bind(this);
И не забудьте прочитать документ, чтобы понять, как он работает под капотом: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
Возможно, вам стоит попытаться заменить
request.onload=function() {
this.daten=request.response;
alert(this.daten[1].Name); // this works
}
функцией стрелки
request.onload=()=> {
this.daten=request.response;
alert(this.daten[1].Name); // this works
}
Просто попробуйте со ссылкой на это в функции обратного вызова:
class MakePage {
constructor() {
var request=new XMLHttpRequest();
request.open('GET','daten.json');
request.responseType='json';
request.send();
self=this;
request.onload=function() {
self.daten=request.response;
alert(self.daten[1].Name); // this works
}
}
test(name) {
document.getElementById(name).innerHTML=this.daten[1].Name;
}
}
this
внутри request.onload=function()
относится к неправильной области.
Используйте функцию стрелки, например request.onload =() => {}
(рекомендуется), или сохраните ссылку на внешнюю область, выполнив const self = this
где-нибудь в конструкторе.
this
проблема.