NgZone не работает должным образом в угловых 4
Я задерживаю ввод пользователя, чтобы он соответствовал вводу пользователя, когда я использую ngZone
сервис, это дает мне ошибку, как
core.es5.js:1084 ERROR TypeError: Cannot read property 'runOutsideAngular' of undefined
at questions-box.component.ts:111
at ZoneDelegate.webpackJsonp.754.ZoneDelegate.invokeTask (zone.js:398)
at Object.onInvokeTask (core.es5.js:4116)
at ZoneDelegate.webpackJsonp.754.ZoneDelegate.invokeTask (zone.js:397)
at Zone.webpackJsonp.754.Zone.runTask (zone.js:165)
at ZoneTask.invoke (zone.js:460)
at timer (zone.js:1540)
Я правильно импортировал и внедрил Сервис ngZone в мой компонент
вот фрагмент моего кода
onCategoryChange() {
this.categorySearchTemp = null;
this._timeout = null;
if (this._timeout) {
window.clearTimeout(this._timeout);
}
this._timeout = window.setTimeout(function () {
this._timeout = null;
this.lc.runOutsideAngular(() => {
this.lc.run(() => {
console.log("VALUE", this.categorySearch);
this.getCategory(this.categorySearch);
});
});
}, 1000);
}
1 ответ
Используйте функцию "толстая стрелка", чтобы сохранить "это"
window.setTimeout(function () {...}), 1000)
следует изменить на
window.setTimeout(()=> {...}), 1000)
Вот что MDN говорит о "толстой стрелке": "У выражения функции стрелки более короткий синтаксис, чем у выражения функции, и он не привязывает свой собственный this, arguments, super или new.target".
Например,
class A {
callMeWithFatArrow() {
setTimeout( () => {
this.callThis();
});
}
callMe() {
setTimeout(function () {
try {
this.callThis();
}
catch (e) {
alert('exception' + e);
}
});
}
callThis() {
alert('i am here - callThis');
}
}
let a = new A();
a.callMe();
a.callMeWithFatArrow();
callMe - предупредит об исключении, потому что setTimeout использует обычную функцию, которая устанавливает свою собственную this.
callMeWithFatArrow - сможет вызывать другой метод класса A внутри setTimeout, потому что setTimeout в этом случае использует "жирную стрелку", которая не устанавливает свое собственное this.