我正在尝试创建一个自定义管道来获取特定帖子的点赞,它有一个连接到数据库并提取与特定帖子相关的所有点赞的服务,但是当我尝试在我的代码中运行时,我得到了返回值在获得服务响应之前,我知道我应该等待响应,但不知道该怎么做..请帮我解决这个问题。
HTML 页面
<a [ngClass]="{'like': toggle, 'dislike': !toggle}" (click)="addremovecomment($event, mainpost)" class="float-right btn-sm text-black btn mr-1 dislike"><span><i class="fa fa-heart" style="color: dislike;"></i></span><label class="ml-1" id="lbl{{mainpost.id}}">{{mainpost | like }}</label></a>
服务
getalllikes(post: MainPost): Observable<any> {
return this.http.post<any>(this.baseUrl + 'GetLikes', post);
}
管道
import { Pipe, PipeTransform } from '@angular/core';
import { MainPost } from '../_models';
import { LikesService } from '../_services';
import { retry } from 'rxjs/operators';
@Pipe({
name: 'like'
})
export class LikePipe implements PipeTransform {
postlikes = 0;
constructor(private likeservice: LikesService) {
}
transform(post: MainPost, ...args: any[]): any {
const UserId = localStorage.getItem('UserId');
this.getlikes(post);
if (this.postlikes === 0) {
return '0 Likes';
} else {
return this.postlikes + ' Likes';
}
}
getlikes(post: any) {
this.likeservice.getalllikes(post).subscribe(data => {
console.log();
// likes = data;
this.postlikes = data;
}, (err: any) => console.error(err));
}
}
最佳答案
我认为最好的做法是将 View 逻辑保留在管道内,您可以在Observables
的帮助下处理每个帖子的点赞总数。 ,transform
方法应该返回 Subject<T>
:
@Pipe({
name: 'like'
})
export class LikePipe implements PipeTransform {
constructor(private likeService: LikeService) {}
transform(id: number) : Subject<Object> {
let likeSubject = new Subject<string>();
this.likeService.getAllLikes(id)
.subscribe(
(posts: number) => {
let message = "";
if (posts == 0)
message = "No Likes"
else
message = posts.toString() + " Likes"
likeSubject.next(message);
});
return likeSubject;
}
}
你必须告诉 Angular 来解决它 async
关键字:
<span>Post1 {{ ( id | like ) | async}}</span>
<hr>
<span>Post2 {{ ( id2 | like ) | async}}</span>
这是完整的工作StackBlitz应用程序与您的问题。
关于angular - 在服务返回值之前从 Angular 自定义管道获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61250165/