Angular2 @Input和http.get

时间:2016-02-13 22:46:45

标签: input components angular angular-http

在将数据从组件传递到另一个组件时,我遗漏了一些东西。我使用@Input传递数据,我从http.get请求中获取数据。问题是,我在尝试从传递的输入中访问属性时遇到错误,而请求尚未解决。

//news.ts
import {Component} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';
import {Pagination} from './pagination';

@Component({
    selector: 'news',
    templateUrl: 'app/news.html',
    viewProviders: [HTTP_PROVIDERS],
    directives: [Pagination]
})
export class News {

    news = [];

    pagination: Pagination;

    constructor(http: Http) {
        http.get('http://test.com/data')
            .map(res => res.json())
            .subscribe(news => this.news = news);
    }
}

//pagination.ts
import {Component, Input} from 'angular2/core';

@Component({
    selector: 'pagination',
    templateUrl: 'app/pagination.html'
})
export class Pagination {
    // page: int = 1;

    @Input() config;

    constructor() {
        // this.page = this.config.number;
    }
}

//Pagination.html
Page {{config.total}}

config.total在加载时生成错误。但是,{{config}}似乎可以正常工作。

有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

有两种解决方案:

您可以在pagination.html中使用Elvis运算符

Page {{config?.total}}

这是来自Angular文档:

Elvis运算符(?)表示雇主字段是可选的,如果未定义,则应忽略表达式的其余部分。

第二种解决方案是使用异步管道: https://angular.io/docs/ts/latest/api/common/AsyncPipe-class.html

在这种情况下,您需要重写代码。

答案 1 :(得分:1)

构造函数中没有用@Input()修饰的变量。您必须等到Angular解析绑定并稍后在component's lifecycle中访问它:

ngOnInit() {
    this.page = this.config.number;
}

答案 2 :(得分:0)

@Vlado Tesanovic我刚尝试了第二个解决方案,因为我可能需要处理构造函数中的数据。 我做了什么:

//news.ts
    constructor(http: Http) {
        // http.get('http://lechiffonbleu.com:1337/news/test')
        //  .map(res => res.json())
        //  .subscribe(news => this.news = news);

        this.news = new Promise((resolve, reject) => {
            resolve = http.get('http://lechiffonbleu.com:1337/news/test')
                .map(res => res.json())
                .subscribe(news => this.news = news);

            console.log(this.news);
            console.log(resolve);
        });
    }

我无法弄清楚如何正确解决这个问题所以它不会在pagination.ts中的@input中抛出错误