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?
use async pipe for loading data by observable.
You can use ChangeDetectorRef class to forcefully detect changes for a component and it's child components. You will need to create class property of type ChangeDetectorRef like following:
After you load data in OnInit(), just call detectChanges() method to manually run change detection:
I am having same issue with angular2, calling API from OnInit/AfterViewInit and bindings are not updated in view (select dropdown array not populated inside view). Above approach worked for me, but root cause is still unknown to me.
Here is how I solved the issue:
You shouldn't use
this.classroom
though, it should be:Try adding the ngFor in the ul tag
also maybe you have not pasted your entire code, i don't see a injection of the service component.
you will need to import and inject the service in the component that you want to use it in. In the component constructor
Hopefully you have tested that your commentService is returning data via console.log
Try this
template:
<ul><li *ngFor="let comment of comments|async"> {{comment.Name}}</li></ul>
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