6

I am working on loading a blog feed via the Google Blogger API and displaying the results in a component. I cannot figure out how to assign the { "items":[] } array to a posts variable to get the posts to display. Here is what I have:

Component:

import { Component, OnInit } from '@angular/core';
import { FeedService, Feed } from './feed.component.service';
import { Observable } from 'rxjs/Observable';

@Component({
selector: 'feed',
templateUrl: './feed.component.html',
styleUrls: ['./feed.component.scss']
})
export class FeedComponent implements OnInit {
    constructor(private feedService: FeedService){ }
    feed: Feed;
    posts: string[];

    ngOnInit(){
        this.feed = this.feedService.loadFeed();
        this.posts = this.feed['items'];
    }
}

the Service:

import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Feed } from './feed.component.service';

import 'rxjs/add/operator/map';

export interface Feed {
    [key: string]: any;
}

@Injectable()
export class FeedService {
    constructor(private http: Http){ }
    loadFeed(): Observable<Feed> {
        const headers = new Headers();
        headers.append('Content-Type', 'application/json');

        const options = new RequestOptions({ headers: headers });

        return this.http
            .get('https://www.googleapis.com/blogger/v3/blogs/3213900/posts?key=AIzaSyDDF7BymSIZjZKJ5x_FCLnV-GA1TbtIyNI', options)
            .map(response => response.json().data as Feed);
    }
}

and the HTML(also using Bootstrap 4):

<button class="btn back">Back</button>
<div class="header">
    <div class="container">
        <div class="row">
            <h1>feed</h1>
        </div>
    </div>
</div>
<div class="post">
    <div *ngFor="let post of posts">
        <h1> {{ post.title }} </h1>
        <p> {{ post.content }} </p>
    </div>
</div>
<div class="footer">
    <div class="container">
        <div class="row">
        </div>
    </div>
</div>

The JSON returns with a key "items": [] that contains an array of objects for the posts. Within each post is a title and content key. I cannot get any posts to display. Any help is greatly appreciated.

2

1 Answer 1

2
//here
this.feed = this.feedService.loadFeed();
this.posts = this.feed['items'];

you're calling the method as it was a synchronous call.

this.feedService.loadFeed() returns an Observable, you have to subscribe to the stream and assign the data to your context once available.

this.feedService.loadFeed().subscribe(resp => this.posts = resp.items)
Sign up to request clarification or add additional context in comments.

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.