打字稿:缺少属性值

时间:2017-05-29 17:03:12

标签: javascript json angular typescript

我会给出关于此的不良信息,因为我真的不知道如何获取更多信息。问题是:我在打字稿中有一个json对象。所以:

  1. 当我使用console.log(obj)时,我可以在控制台上看到它的所有属性
  2. 当我尝试访问其中一个属性时,它的值只是消失(变成一个空字符串)
  3. 当我尝试JSON.stringify(obj)属性时,它的值确实缺失
  4. 在尝试JSON.stringify(obj)之后,在下一个代码行中,console.log(obj)显示该属性已经消失。
  5. 运行以下代码时会发生更多有趣的事情:

    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);
      }
    }
    

    enter image description here

    当我第一次尝试访问它时,显然它消失了(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);
    }
    

    所以它给我留下了两个选择:

    1. Angular模型更改检测出现问题(不要这么认为)
    2. 我对setTimout如何工作的理解有些不对劲(可能不是300毫秒,但更深层次,工作方式)
    3. [编辑2]:现在我修复了应用程序,不久之前有些事情发生了。在测试期间,当我确保由模糊事件启动的bar()在foo()之前被调用超过300毫秒时,我很有可能只是在页面背景中单击(不是真的在另一个控件中)强制模糊事件。如果这不足以引起模糊事件怎么办?不知道背景是否能够聚焦。我知道,这是不现实的,但是当我在错误的部位寻找问题时,我可能没有注意到它。单击后台后我做的下一件事就是点击执行foo()的按钮。实际上,这个点击是什么把焦点从控件中解放出来(触发启动bar()函数的模糊事件)该怎么办?在这种情况下,它可以解释为什么延迟会弄乱一切。

0 个答案:

没有答案