Я пытаюсь установить свойство slides [] с данными, полученными из файла json в моей карусельной службе. Мой компонент карусели вводит службу карусели и вызывает общедоступную функцию getSlides (), но возвращаемое значение является пустым массивом.
Что я делаю неправильно?
При этом код:
//carousel.component.ts
import { Component, OnInit } from '@angular/core';
import { CarouselService } from '../../services/carousel.service';
@Component({
selector: 'app-carousel',
templateUrl: './carousel.component.html',
styleUrls: ['./carousel.component.css']
})
export class CarouselComponent implements OnInit {
slides: string[];
constructor(private carouselService: CarouselService) { }
ngOnInit() {
this.getSlides();
}
getSlides(): void {
this.carouselService.getSlides()
.subscribe(slides => {
console.info('show slides', slides);
this.slides = slides
});
}
}
Carousel.service.ts
import { Injectable } from '@angular/core';
import { Observable, of, ObservableInput } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { catchError, map, tap } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CarouselService {
slides: string[] = [];
constructor(private http: HttpClient) {
this.getJSON().subscribe(data => {
this.slides = data['Carousel'];
console.info('data loaded');
});
}
public addSlide(title: string) {
this.slides.push(title);
}
public getSlides(): Observable<string[]> {
return of(this.slides);
}
private getJSON(): Observable<Object> {
return this.http.get("./assets/carousel.json");
}
}
не могли бы вы опубликовать свои данные json
@Suryan Спасибо за ваш комментарий. Я последовал твоему совету и изменил код. Часть логики перенесена в Сервис, а часть - в Компонент. Я также изменил функцию, которую я вызываю во внешнем интерфейсе, на асинхронную, а затем жду вывода. Это прекрасно работает. Я дополню вопрос изменениями, но вы направили меня на правильный путь, вы заработали баллы за ответ на мой вопрос.





Я воспользовался советом Сурьяна в разделе комментариев и реорганизовал свой код, чтобы использовать функции async / await, а во внешнем интерфейсе компонент был обновлен, чтобы включить свойства.
import { Injectable } from '@angular/core';
import { Observable, of, ObservableInput } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { catchError, map, tap } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CarouselService {
constructor(private http: HttpClient) { }
async public getJSON(): Observable<Object> {
return this.http.get("./assets/carousel.json");
}
}
//carousel.component.ts
import { Component, OnInit } from '@angular/core';
import { CarouselService } from '../../services/carousel.service';
@Component({
selector: 'app-carousel',
templateUrl: './carousel.component.html',
styleUrls: ['./carousel.component.css']
})
export class CarouselComponent implements OnInit {
slides: string[];
constructor(private carouselService: CarouselService) { }
ngOnInit() {
this.getSlides();
}
getSlides(): void {
this.carouselService.getSlides()
.subscribe(await slides => {
console.info('show slides', slides);
this.slides = slides
}.bind(this));
}
}
Просто примечание, есть более эффективные способы выполнения асинхронной операции. Я только что прочитал документацию Angular.io, и там можно использовать асинхронные каналы.
Службы - не лучшее место для подписки, вместо этого подпишитесь на наблюдаемый компонент. измените свой getJSON на общедоступный и вместо этого вызовите this.carouselService.getSlides (), вызовите this.carouselService.getJSON () и почему снова сделайте свой массив наблюдаемым, если вы становитесь наблюдаемым и по способу выполнения асинхронной операции и при вызове this.carouselService.getSlides () ваш массив слайдов пуст