Typescript无法访问JSON对象(Angular2)

时间:2016-03-16 12:22:35

标签: javascript json typescript angular

我遇到了最奇怪的问题。

我正在接收JSON对象

{"login":"admin","name":"Admin"}

我在代码中所做的是:

private _userData: User;
...
private getUserData() {
    this._userInfoService.getUserInfo()
        .subscribe(
            data => {
                this._userData = data.json(); // (using <User> data.json() changes nothing
            },
            err => alert(err)
        );
}

用户类型

的位置
export interface User {
    login: string;
    name: string;
}

但是当我尝试使用angular:

访问html中的那些字段时
<p>{{ _userData.login }}</p>
<p>{{ _userData.name }}</p>

我在控制台中遇到一些令人讨厌的错误: Error: EXCEPTION: TypeError: l__userData21 is null in [{{ _userData.login }} in UserHomeComponent@8:7]

虽然我可以清楚地看到我在这个对象上做console.log的时间: Object { login: "admin", name: "Admin" }

我和其他班级完全一样,它在那里工作。更有趣的是,当我稍微更改代码时,就像这样:

private _name: string;
private _login: string;
...
private getUserData() {
    this._userInfoService.getUserInfo()
        .subscribe(
            data => {
                this._name = (<User> data.json()).name;
                this._login = (<User> data.json()).login;
            },
            err => alert(err)
        );
}

并查看:

<p>{{ _login }}</p>
<p>{{ _name }}</p>

然后一切都完美无缺!我完全不知道发生了什么(试图将data.json()转换为但是什么都没有改变。)

@Edit: 其他类,它的工作原理是:

export interface LoginData {
    access_token: string;
    token_type: string;
    refresh_token: string;
    expires_in: number;
    scope: string;
}


private _loginData = <LoginData> JSON.parse(sessionStorage.getItem("loginData")); //tried this also with User, doesn't work

并在视图中:

<p>access_token: {{ _loginData.access_token }}</p>
<p>token_type: {{ _loginData.token_type }}</p>
<p>refresh_token: {{ _loginData.refresh_token }}</p>
<p>expires_in: {{ _loginData.expires_in }}</p>

4 个答案:

答案 0 :(得分:10)

用户数据是异步进入的,这意味着它之前是未定义。 这是因为你执行未定义 .login

,因此angular会抛出异常

您需要做的是使用elvis-operator指示userData可能未定义。

试试这个:

<p>{{ _userData?.login }}</p>
<p>{{ _userData?.name }}</p>

或者你可以使用包装* ngIf例如

顺便说一下这与打字稿无关,而是与angular2和javascript有关。请正确编辑你的标题

答案 1 :(得分:0)

您尝试建立到_userData.login而不是_userData

的数据绑定

我看到两个可能的错误:

第一: - 正如Patrick已经写过的那样,您的数据是异步到达的,这意味着当您尝试建立数据绑定时,_userData.login未定义,因为_userData未定义(并且没有默认的空值)。因此,数据绑定失败,当您稍后更新时,您将无法获得通知/获取任何更新 - 你的第二个例子是有效的,因为_name_login没有未定义但是填充了NULL值(我猜一个空字符串)。因此,数据绑定实际上已经成功建立了

第二: - 第二个可能的错误是对象引用和对象属性的绑定。 - 根据更改侦听器的实现方式,它实际上是obj1 = newObjectobj1.attr1 = newValue之间的差异。因此,仅更改对象本身不会触发单个属性上的更改侦听器。

但是,我敢打赌它是第一种可能性。您可以通过在构造函数中使用空对象初始化User对象来测试它...

答案 2 :(得分:0)

尝试在<p>标记前添加类似内容:

<div *ngFor="let uData of _userDat;">

然后

<p>{{uData.login}} 
</p></div>

OR

<div *ngIf="user">
<p>{{_userDat.login}}</p>

答案 3 :(得分:0)

使用进行安全导航。

<p>{{ _userData?.login }}</p>