angular - 在服务返回值之前从 Angular 自定义管道获取返回值

标签 angular typescript angular-services angular-pipe

我正在尝试创建一个自定义管道来获取特定帖子的点赞,它有一个连接到数据库并提取与特定帖子相关的所有点赞的服务,但是当我尝试在我的代码中运行时,我得到了返回值在获得服务响应之前,我知道我应该等待响应,但不知道该怎么做..请帮我解决这个问题。

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/

相关文章:

arrays - 如何从 Angular2(Typescript) 中的 Json 数组中获取值的总和

arrays - 从 Json Angular 5 插入数组

javascript - 单击"is"按钮时添加边框和背景颜色

javascript - 在Angular JS中的 Controller 之间传递数据?

javascript - Controller 未从服务接收到数据

angular - 没有 FormControl 实例附加到具有名称的表单控件元素

angular - 如何在service worker中刷新图片

Angular 4 setTimeout不等待

mysql - 使用 Node、Mysql 和 TypeScript 解析 Promise 链

angular - 当 Angular 可以检测到最新值时,为什么要在服务中使用 Subject 或 BehaviorSubject?