gpt4 book ai didi

angular - 在Angular 6中通过http get处理复杂对象

转载 作者:行者123 更新时间:2023-12-01 12:12:46 25 4
gpt4 key购买 nike

我不明白如何处理我订阅的对象。对象结构如下:

{
data:{
date: "2018-02-20 13:10:23",
text: "Описание",
id: 1,
items: [
0: {
date: "2018-02-20 13:10:23",
text: "Описание",
images: [
0: "image1.jpg",
1: "image2.jpg"
],
name: "Изображения",
type: "images"
},
1: {
date: "2018-02-20 13:10:23",
text: "Описание",
image: null,
type: "video",
url: "https://www.youtube.com/embed/v64KOxKVLVg"
}
]
}
}

我通过以下服务提出上诉:
import {HttpClient} from '@angular/common/http';
import {Injectable} from '@angular/core';
@Injectable()
export class VideoService {
constructor(private http: HttpClient) {}

getVideoTape() {
return this.http.get(`http://ip_adress/api/v1/mixed_galleries/1`);
}
}

有一个接口(interface)模型:
export class VideoListModel {
constructor(
public created_at: string,
public description: string,
public id: number,
public items: any[],
public name: string
) {}
}

我在组件中进行处理:
import {Component, OnDestroy, OnInit} from '@angular/core';
import {Observable, Subscription} from 'rxjs';
import {filter} from 'rxjs/operators';
import {VideoService} from '../shared/services/video.service';
import {VideoListModel} from '../../shared/models/video-list.model';

@Component({
selector: 'app-video-index',
templateUrl: './video-index.component.html',
styleUrls: ['./video-index.component.scss']
})

export class VideoIndexComponent implements OnInit, OnDestroy {
private videoTape = [];
private _subscription2: Subscription;

constructor( private videoService: VideoService ) { }

ngOnInit() {
this._subscription2 = this.videoService.getVideoTape()
.subscribe((data: VideoListModel[]) => {
this.videoTape = data;
console.log(this.videoTape);
});
}

ngOnDestroy() {
this._subscription2.unsubscribe();
}

}

任务是按类型从对象中进行选择:“视频”。通过 AJAX + jQuery 没有问题,在 Angular 中我比较新。昨天铲了一堆视频类(class),但没有过滤这种复杂对象的例子。

build :
this._subscription2 = this.videoService.getVideoTape()
.pipe(filter((data: VideoListModel[]) => data.items.type === 'video'))
.subscribe((data: any) => {
this.videoTape = data.data;
console.log(this.videoTape);
});

不起作用。结果是一个错误,提示“类型'VideoListModel []'上不存在属性'项目'”。直觉上,我知道问题很可能在界面中,但我无法理解如何修改界面以使过滤正常工作。如果有人遇到过滤复杂对象,请告诉我如何解决这个问题。

最佳答案

您没有一组 VideoModel,而是一组 items在一个对象中。将整个内容传送到过滤器可以让您从数组中过滤项目,但您有一个对象。您可以尝试以下解决方法:

创建这样的界面

interface Item {
date: Date;
text: string;
images: string[];
name: string;
type: string;
}

export interface VideoModel {
data: {
date: Date;
text: string;
id: number;
items: Item[];
}
}

然后你可以在你的服务中使用 HttpClient 如下
import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
[...]

getVideoTape(): Observable<VideoModel> {
return this.http.get<VideoModel>(url).pipe(
map(model => {
const items = model.data.items.filter(item => item.type === 'video');
model.data.items = items;
return model;
}),
catchError(error => console.error(error))
);
}

请注意您的图像数组,因为它不是有效的 json, string[]?过滤服务器端的类型以减少流量不是更好吗?

关于angular - 在Angular 6中通过http get处理复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50524711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com