【问题标题】:HTTP Observable subscribe working in component, but triggers error 'undefined' in template (Angular2+TS)HTTP Observable 订阅在组件中工作,但在模板中触发错误“未定义”(Angular2+TS)
【发布时间】:2016-06-03 06:44:58
【问题描述】:

我遇到了一个对我来说似乎有点神秘的错误。也许一些新的眼睛可以发现我的错误!

我有一个详细组件和一个列表组件,我从服务器检索数据。我的列表组件就像一个魅力,但我在使用细节组件时遇到了麻烦。来自服务器的数据是正确的,但是当我尝试将其打印到浏览器时,它给了我未定义的错误(无法获取未定义的名称)。在 ngOnInit 方法中一切正常,它按预期将我的数据记录到控制台。以下是详细组件中我的代码的相关部分:

export class HeroDetailComponent implements OnInit {

    @Input() hero: Hero; //also tried without the input in front of hero

    constructor(public _routeParams: RouteParams, public _service: Service) {

    }

    ngOnInit() {
        let id = this._routeParams.get('id');
        this._service.getById(id)

            .subscribe(hero => {
                this.hero = hero;
                console.log("hero: ", this.hero); //the correct data is logged!
            });     
    }
}

在模板中:

<h1>Hero: {{hero.name}}</h1>

作为参考,列表组件中的相同相关代码列出了所有英雄并且完美运行。

export class HeroListComponent implements OnInit {
    name: string;
    id: string;
    date: string;
    heroes: Array<Hero>;

    constructor(public _service: Service, public _router: Router) {

    }

    ngOnInit() {
        this.getHeroes();
    }

    getHeroes() {
        this._service.getHeroes()
            .subscribe(heroes => this.heroes = heroes);
    }
}

模板:

<table>
    <tr *ngFor="let hero of heroes" >
    <td>{{hero.name}}</td>
    </tr>
</table>

我真的无法发现我的细节组件有什么问题???提前感谢您的帮助!

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    在这些情况下我会使用 elvis (?) 运算符:将 {{hero.name}} 更改为 {{hero?.name}} 这样当 hero 可用时,它会将结果打印到模板中

    【讨论】:

    • 嘿,谢谢!我是新来的,我想知道有些问题有绿色背景,有些则没有!我不知道你能做到这一点。所以现在我知道了,现在完成了! :)
    【解决方案2】:

    你试过了吗?

    <h1 *ngIf="hero">Hero: {{hero.name}}</h1>
    

    【讨论】:

    • 这也有效!现在我只需要弄清楚如何让模板的其余部分工作,因为我在 Hero 对象中嵌套了对象。但这是一个全新的问题!
    • @AJT_82 您可以在我对嵌套对象的回答中使用 elvis 运算符。例如: hero?.properties?.name 仅当 hero 对象具有属性时才会打印名称。
    • @echonax 很高兴知道!这当然与原始问题无关,但是:例如,我在同一模板中调用 methods 来遍历嵌套对象,这是一个完全组成的对象的示例,以展示我的意思:@ 987654322@ 然后我更进一步地遍历前一个对象的另一个对象,如下所示:*ngFor="let dogs of animals.getDogs()" 所以我认为这让它变得更加棘手......
    • @AJT_82 那么这里有什么问题呢?如果hero.getAnimals() 返回一个动物数组,你仍然可以使用{{animals?.name}} 打印动物名称,前提是该动物具有名称属性
    • @echonax 问题已经出现在方法的调用中! cannot read property 'getAnimals' of undefined。当我从模板中删除除带有英雄名称的 h1 之外的所有内容时,hero.name 的打印效果很好,无论是使用 elvis 运算符还是您的 ngif 建议。但是当我添加模板的其余部分时,它会抱怨在方法调用中未定义 hero。我尝试用&lt;div *ngIf="hero"&gt; &lt;/div&gt; 包装整个模板,但这给了我错误...
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2016-11-17
    • 2016-10-28
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多