comment.component.ts:
import { Component, OnInit } from '@angular/core';
import { Router} from '@angular/router'
import { Comment } from 'comment entity path'
import {CommentService} from 'comment service path'
import { Observable } from 'rxjs/Observable';
@Component({
template: ` <ul><li *ngFor="let comment of comments|async"> {{comment.Name}}</li></ul>`
})
export class CommentComponent implements OnInit {
comments: Observable<comment[]>;
constructor(private router: Router, private commentService: CommentService) {
}
ngOnInit() {
this.comments = this.getComments();
}
getComments() {
return this.commentService.getComments();
}
}
comment.service.ts
import { Injectable } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';
import { Comment } from 'comment path here';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
@Injectable()
export class CommentService {
private commentUrl = 'api path'; // URL to web api
constructor(private http: Http) {
}
getComments(): Observable<Comment[]> {
return this.http.get(this.commentUrl).map(
(response) => {
let data = response.text() ? response.json():[{}];
if (data) {
console.log(data);
return data;
}
return data;
});
}
}
Within ngOnInit
method I am able to get list of comments but the problem is the list is not binding using ngFor
on the HTML. This is because HTML is rendering before the response. But On refreshing page data binds automatically. Am I missing something?
Try this
template: <ul><li *ngFor="let comment of comments|async"> {{comment.Name}}</li></ul>
comments: Observable<comment[]>;
ngOnInit() {
this.comments = this.getComments();
}
getComments() {
return this.commentService.getComments();
}
I see 2 problems in your code 1. You call map without returning any value. 2. You try to set values inside map instead of subscribe but the values was undefined once it reach subscribe in your ngOnInit