Reputation: 2259
I'm making a gallery of images in Angular. On click on each image I want to display separate component which is basically clicked image but in full size. Porblem is I'm not sure how to get image which is clicked.
So far I have this service to make API request to get images.
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class ImagesService {
constructor(private http: HttpClient) { }
images = [];
link = 'https://api.com?k=';
ApiKey = '12345';
public loadImages() {
return this.http.get(this.link + this.ApiKey);
}
}
Then I have Gallery Component where I subscribe to loadImages()
export class GalleryComponent {
visibleImages:Object = [];
constructor(private imagesService: ImagesService) {
this.imagesService.loadImages().subscribe(data => this.visibleImages = data);
}
}
Then in HTML of Gallery component I display images like this
<li *ngFor="let image of visibleImages">
<a [routerLink]="['/image', image.id]">
<img src="{{image.urls.small}}"/>
</a>
</li>
So the problem is how to get clicked image? I thought about something like this in my service. But this problem that is how can I store data which I get from API to this.images
? Plus as I understand the response which I'm getting back is an Observable so I can't really store it into an array?
getImage(id:number) {
this.images.slice(0).filter(image => image.id == id);
}
And in Image component
ngOnInit() {
this.image = this.imagesService.getImage(+this.route.snapshot.params['id'])
}
Upvotes: 0
Views: 61
Reputation: 37343
use do
operator to intercept the data :
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import 'rxjs/add/operator/do';
@Injectable()
export class ImagesService {
constructor(private http: HttpClient) { }
images = [];
link = 'https://api.unsplash.com/photos/?client_id=';
ApiKey = 'your key';
public loadImages() {
return this
.http.get(this.link + this.ApiKey)
.do((images: any[]) => this.images = images)
}
getImage(id:number) {
this.images.slice(0).filter(image => image.id == id);
}
}
if the ImageComponent is in the same page as GalleryComponent you have to subscribe to the this.route.params
:
ngOnInit() {
this.route.params.subscribe(params => this.image = this.imagesService.getImage(+params['id']))
}
Upvotes: 1