在服务返回值之前从角度定制管道获取返回值

问题描述 投票:1回答:1

我正在尝试创建自定义管道来获取特定帖子的喜欢,它具有连接到数据库并提取与特定帖子相关的所有喜欢的服务,但是当我尝试在自己的代码中运行时,我会在从服务获得响应,我知道我应该等待响应,但不确定如何执行..请帮助我解决此问题。

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));

  }

}
angular typescript angular-services angular-pipe
1个回答
0
投票

[我认为将视图逻辑保留在管道中是一种最佳实践,可以在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应用,带有您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.