angular2 ngFor not working while fetching data from api on ngOnInit()

后端 未结 6 471
别跟我提以往
别跟我提以往 2021-01-13 03:42

comment.component.ts:

import { Component, OnInit } from \'@angular/core\';
import { Router} from \'@angular/router\'
import { Comment } from         


        
相关标签:
6条回答
  • 2021-01-13 04:22
     I have found a solution of my issue using Zone and promise.
     below is the update code of the "comments.component.ts".
     by using zone.run(), I am able to bind data with HTML when
     "comments.component" is loaded.    
    

    Is this a correct way to bind data with HTML if data is coming using api?

        import { Component, OnInit, NgZone } from '@angular/core';  //NgZone *
        import { Router} from '@angular/router'
        import { Comment } from 'comment entity path'
        import {CommentService} from 'comment service path'
        import { Observable } from 'rxjs/Observable';
        import 'rxjs/add/operator/toPromise'   // *
        @Component({
            template: `<ul  *ngIf="comments && comments.length > 0">
                       <li *ngFor="let item of comments"> {{item.Name}}</li>
                       </ul>`
        })
        export class CommentComponent implements OnInit {
            comments: comment[]=[];   // *
    
            constructor(private router: Router, private commentService: CommentService, private zone: NgZone) {
            }
    
            ngOnInit() {
    
              this.zone.run(() => {
                this.getComments().toPromise().then((data) => {
                    this.comments= data || [];
                });
                })
             }
    
            getComments() {
                return this.commentService.getComments();
            }
    
        }
    
    0 讨论(0)
  • 2021-01-13 04:27

    One solution would be to only display your ul once your comments have been loaded, which would then force a refresh. So something like:

    <ul *ngIf="comments"><li *ngFor="let comment of comments">{{comment.Name}}</li></ul>

    So once comments has been loaded, Angular will force a refresh, and the ul will be added to the DOM, at which point it will have all the data it needs to bind an li per comment.

    0 讨论(0)
  • 2021-01-13 04:30

    use async pipe for loading data by observable.

    <li *ngFor="let comment of comments | async">
    
    0 讨论(0)
  • 2021-01-13 04:39

    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:

    private cdr: ChangeDetectorRef
    

    After you load data in OnInit(), just call detectChanges() method to manually run change detection:

    this.cdr.detectChanges();
    

    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.

    Please direct me to the root cause for this issue as I am unable to find one.

    0 讨论(0)
  • 2021-01-13 04:43

    Try adding the ngFor in the ul tag

    <ul  *ngFor="let comment of comments"><li > {{comment.Name}}</li></ul>`
    
    or
    
    <ul  *ngFor="let comment of (comments|async)"> <li> {{comment.Name}}</li></ul>`
    

    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

        import {CommentService} from '../path to service'
    
        constructor(private commentService: CommentService) 
        {
    
        //you can call the getcomments service here itself or in ngOnInit
        this.commentService.getComments().subscribe(data =>    
                     {    
                       console.log(data)
                      }
        } //end constructor
    

    Hopefully you have tested that your commentService is returning data via console.log

    0 讨论(0)
  • 2021-01-13 04:49

    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

    0 讨论(0)
提交回复
热议问题