Angular2 奇怪的硬编码对象与 http.get 对象问题



我有相同的JSON数据,我保存在.ts(硬编码)和.json(http get)中。这两个对象在开发控制台中看起来相同。

我可以使用"{{披头士乐队|json}}" 和 "{{beatlesjson.paul |json}}"以打印从外部 JSON 检索到的数据,但我无法打印输出"{{beatlesjson.paul.name |json}}",它会进一步破坏应用程序执行。

当使用相同的 JSON 但在 TS 文件中硬编码时,以前的 paragraf 按预期工作。

附言。我注意到如果我不启动,我什至无法打印对象和第一个子关卡:披头士:对象 = {}; 最初。但它仅适用于顶层和第一级,但在对象的第二级子级中断。

import {Component,ElementRef,AfterViewChecked,enableProdMode} from 'angular2/core'; enableProdMode();
import {Http, Response, RequestOptions, Headers, HTTP_PROVIDERS, HTTP_BINDINGS} from 'angular2/http';
@Component({
    selector: 'my-app',
    template: `
        <pre>
        WORKS {{ beatles | json }}
        WORKS {{ beatlesjson | json }}
        <hr>
        WORKS {{ beatles.paul | json }}
        WORKS {{ beatlesjson.paul | json }}
        <hr>
        WORKS {{ beatles.paul.name | json }}
        <!-- BREAKS FURTHER EXEC, DOES NOT WORK {{ beatlesjson.paul.name | json  }} -->
        <hr>
        </pre>
    `
})
export class AppComponent {
    beatles: Object = {};
    beatlesjson: Object = {};
    constructor(http: Http){
        this.beatles = {
            john: {
                name: 'John Lennon',
                description: 'Imagining all the people',
                deceased: true
                },
            paul: {
                name: 'Paul McCartney',
                description: 'Believes in Yesterday',
                deceased: false
                },
            george: {
                name: 'George Harrison',
                description: 'His guitar gently weeps',
                deceased: true
                },
            ringo: {
                name: 'Ringo Starr',
                description: 'Going to put him in the movies',
                deceased: false
            }
        }
          http.get('app/beatles.json')
            .subscribe(
                data => { this.beatlesjson = data.json()  },
                err => console.log(err),
                () => console.log(this.beatlesjson)
            );


    }


}

您可以使用 Elvis 运算符来防止此行为:

{{ beatlesjson?.paul?.name | json  }

问题的原因是数据是通过 HTTP 请求异步接收的。因此,beatlesjson属性在开始时是未定义的。

这是因为构造函数主体在 html 被内插之前执行。 所以beatles.paul存在。

快速修复 :

而不是 : <!-- BREAKS FURTHER EXEC, DOES NOT WORK {{ beatlesjson.paul.name | json }} -->执行以下操作:

{{ beatlesjson && beatlesjson.paul && beatlesjson.paul.name | json  }}

确保您不会错误地访问某些undefined的成员。

相关内容

最新更新