我正在尝试创建自定义管道来获取特定帖子的喜欢,它具有连接到数据库并提取与特定帖子相关的所有喜欢的服务,但是当我尝试在自己的代码中运行时,我会在从服务获得响应,我知道我应该等待响应,但不确定如何执行..请帮助我解决此问题。
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);
}
Pipe
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));
}
}
[我认为将视图逻辑保留在管道中是一种最佳实践,可以在Observables
的帮助下处理每个帖子的喜欢总数,transform
方法应该返回Subject<T>
:
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应用,带有您的问题。