3

I have successfully fetch data from jsonplaceholder fake api https://jsonplaceholder.typicode.com/posts

I am trying to bind it using angular 2 {{}} but i am getting following error. I have no clue what i am doing wrong if any body could help me that will be grate full. Below is my code and error.

Error: Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

import { Component } from '@angular/core';
import {BioService} from './bio.service'
import { Users } from './User';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app works!';
values : any;
users: Users[];
errorMessage: string;
mode = 'Observable';

profile = {};
constructor(private bioservice:BioService)
{

}

ngOnInit(){
     this.getHeroes();
     debugger;
}

  getHeroes() {
  this.bioservice.getHeroes().subscribe(data => this.profile = data);
 }

}

HTML Template:

<h1>
<div>
<ul *ngFor= "let user of profile">
<li>{{user.userId}}</li>
</ul>
</div>
</h1>

Service:

        import { Injectable } from '@angular/core';
        import { Http, Response, Headers, RequestOptions } from '@angular/http';
        import {Observable} from 'rxjs/Rx';
        import 'rxjs/add/operator/map';
        import 'rxjs/add/operator/catch';
        import { Users } from './User';


        @Injectable()
        export class BioService {

        private url = 'http://bioapideploy.azurewebsites.net/api/Users';
        private placeholderurl = "https://jsonplaceholder.typicode.com/posts";

          constructor(private http: Http) { }

          getHeroes() {
            debugger;
            return this.http.get(this.placeholderurl)
            .map((res:Response) => res.json());
          }

          private extractData(res: Response) {
            debugger;
            let body = res.json();
            return body.data || { };
          }


          private handleError (error: Response | any) {
            // In a real world app, you might use a remote logging infrastructure
            debugger;
            let errMsg: string;
            if (error instanceof Response) {
              const body = error.json() || '';
              const err = body.error || JSON.stringify(body);
              errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
            } else {
              errMsg = error.message ? error.message : error.toString();
            }
            console.error(errMsg);
            return Observable.throw(errMsg);
          }
        }
3
  • 2
    Remove = {} from profile = {}; Commented May 2, 2017 at 20:14
  • You may also need to protect the external <div> with *ngIf="profile" Commented May 2, 2017 at 20:28
  • Thanks friend it worked. Commented May 3, 2017 at 5:55

2 Answers 2

1

In AppComponent change profile = {}; with profile: any[];

Sign up to request clarification or add additional context in comments.

Comments

0

It looks like you are missing the async pipe on your *ngFor statement. Because getHeroes() is returning an Observable you need to use the async pipe like this to let Angular know the data being provided to the *ngFor loop is asynchronous.

<h1>
  <div>
    <ul *ngFor= "let user of profile | async">
      <li>{{user.userId}}</li>
    </ul>
  </div>
</h1>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.