我会给出关于此的不良信息,因为我真的不知道如何获取更多信息。问题是:我在打字稿中有一个json对象。所以:
运行以下代码时会发生更多有趣的事情:
console.log(obj); // shows the property value
console.log(JSON.stringify(obj)); // don't show the property value
console.log(obj); // again shows the property value
对象非常简单,并且没有任何功能。只是数字和字符串。
图像下方显示了Chrome控制台正在打印的内容。属性(matricula)是有问题的。 obj在所有情况下都是相同的。我只是在做:
console.log(obj);
console.log(JSON.stringify(obj));
console.log(obj['matricula']);
for (const i in obj) {
if (obj.hasOwnProperty(i)) {
console.log(`${i}: ${obj[i]}, comprimento: ` + obj[i].length);
}
}
当我第一次尝试访问它时,显然它消失了(obj ['property']或obj.property)。因此,如果我在上面的for循环之后尝试console.log对象,则该属性将丢失。
问题不是概率性的,我的意思是每次这个代码片段运行时都会发生。
[编辑]:
嗯,事情是这样的:
private obj: MyClass1 = new MyClass1();
private newObj: MyClass2 = new MyClass2();
foo() {
this.newObj.matricula = this.obj.matricula;
}
bar() {
setTimeout(() => {
// some code here to do other things
goesToTheDataBaseToGrabData().subscribe((res: MyClass1) => {
this.obj = res;
});
}, 300);
}
基本上,由于与材料2自动完成相关的角度事件传播时间,我无法摆脱setTimeout。
我确定在foo()之前调用了bar()。实际上bar()由输入的blur事件调用。我保证比超时300毫秒长得多,通过按钮点击调用foo()。此时,属性值已经消失(或者,在这种情况下,尚未设置)。
我解决它的方法是将goToTheDataBaseToGrabData()observable带到按钮点击处理程序,并将所有按钮处理程序逻辑带到订阅者函数:
private obj: MyClass1 = new MyClass1();
private newObj: MyClass2 = new MyClass2();
foo() {
goesToTheDataBaseToGrabData().subscribe((res: MyClass1) => {
this.newObj.matricula = res.matricula;
this.obj = res;
});
}
bar() {
setTimeout(() => {
// some code here to do other things
}, 300);
}
所以它给我留下了两个选择:
[编辑2]:现在我修复了应用程序,不久之前有些事情发生了。在测试期间,当我确保由模糊事件启动的bar()在foo()之前被调用超过300毫秒时,我很有可能只是在页面背景中单击(不是真的在另一个控件中)强制模糊事件。如果这不足以引起模糊事件怎么办?不知道背景是否能够聚焦。我知道,这是不现实的,但是当我在错误的部位寻找问题时,我可能没有注意到它。单击后台后我做的下一件事就是点击执行foo()的按钮。实际上,这个点击是什么把焦点从控件中解放出来(触发启动bar()函数的模糊事件)该怎么办?在这种情况下,它可以解释为什么延迟会弄乱一切。