热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

创建自己异步的自定义管道

如何解决《创建自己异步的自定义管道》经验,为你挑选了1个好方法。

我创建了一个自定义管道,可以从API检索文本内容,如下所示:

@Pipe({ name: 'apiText' })
export class ApiTextPipe implements PipeTransform {
  constructor(private myApiService: MyApiService) {
  }

  transform(key: string): Observable {
    return this.myApiService.getText(key);
  }
}

我必须像这样使用它:

{{'some-key' | apiText | async}}

但实际上,我将始终希望结合使用apiTextasync管道。我更喜欢这样写:

{{'some-key' | apiTextAsync}}

我能以某种方式做到这一点,并通过组合两个管道使事情变得更干燥吗?

更新:我已打开GitHub问题作为对此功能的解决方案的功能要求。

Jeroen.. 5

一些评论者指出(正确地如此),这违反了SRP,并可能会损害可读性。但是,即使这会让我重新考虑我是否这个,我仍然肯定想知道如何做到这一点,如果你想要它。我找到了两个解决方案(再次在评论者的帮助下)。

成分(不推荐)

创建自己的内部AsyncPipe并使用它。这是应该工作的基本设置:

@Pipe({ name: 'apiText', pure: false })
export class ApiTextPipe implements PipeTransform, OnDestroy {
  private asyncPipe: AsyncPipe;

  constructor(private myApiService: MyApiService, private injector: Injector) {
    this.asyncPipe = new AsyncPipe(injector.get(ChangeDetectorRef));
  }

  ngOnDestroy() {
     this.asyncPipe.ngOnDestroy();
  }

  transform(key: string): string {
    return this.asyncPipe.transform(this.myApiService.getText(key));
  }
}

除了上述缺点(评论者注意到)之外,我还看到其他问题:

如果AsyncPipe发生了变化(例如,它开始实现)OnInit,那么我们自己的管道也需要更改。您可能会错过这一点。我们管道的实现以这种方式耦合到AsyncPipe不好。

我似乎无法AsyncPipe注射,因为它依赖于special ChangeDetectorRef,所以我使用了这种建议的方法,直接从注射器中询问它。(可能有更好的方法来执行此操作,但是我现在不进一步探讨...)

继承(不推荐)

您也可以尝试extends AsyncPipe在自己的管道中进行操作,但是该路线的代码更加笨拙,将您的管道与异步管道紧密耦合。当我尝试这种方法时,存在一些问题:

您再次需要ChangeDetectorRef转接到super(...)通话

您需要紧密结合到transform方法的签名AsyncPipe

transform得到超级复杂,因为它不再只是需要一个字符串(参见前一点)

我不知道这是否正确使Angular调用超类的ngOnDestroy方法

再加上我忘记的一切。我觉得代码很讨厌,甚至共享它似乎也不明智。

复制源(不推荐)

正如评论者之一建议的那样,的来源AsyncPipe是开放的。因此,您可以采用它并以此构建自己的管道。

由于明显的原因,这不是明智的决定。


最重要的是,我现在对自己的问题的答案(尽管我很高兴地证明另一个答案是错误的!)是,这不容易实现,最好的解决方案是不解决任何问题:只需坚持使用二重奏模板。



1> Jeroen..:

一些评论者指出(正确地如此),这违反了SRP,并可能会损害可读性。但是,即使这会让我重新考虑我是否这个,我仍然肯定想知道如何做到这一点,如果你想要它。我找到了两个解决方案(再次在评论者的帮助下)。

成分(不推荐)

创建自己的内部AsyncPipe并使用它。这是应该工作的基本设置:

@Pipe({ name: 'apiText', pure: false })
export class ApiTextPipe implements PipeTransform, OnDestroy {
  private asyncPipe: AsyncPipe;

  constructor(private myApiService: MyApiService, private injector: Injector) {
    this.asyncPipe = new AsyncPipe(injector.get(ChangeDetectorRef));
  }

  ngOnDestroy() {
     this.asyncPipe.ngOnDestroy();
  }

  transform(key: string): string {
    return this.asyncPipe.transform(this.myApiService.getText(key));
  }
}

除了上述缺点(评论者注意到)之外,我还看到其他问题:

如果AsyncPipe发生了变化(例如,它开始实现)OnInit,那么我们自己的管道也需要更改。您可能会错过这一点。我们管道的实现以这种方式耦合到AsyncPipe不好。

我似乎无法AsyncPipe注射,因为它依赖于special ChangeDetectorRef,所以我使用了这种建议的方法,直接从注射器中询问它。(可能有更好的方法来执行此操作,但是我现在不进一步探讨...)

继承(不推荐)

您也可以尝试extends AsyncPipe在自己的管道中进行操作,但是该路线的代码更加笨拙,将您的管道与异步管道紧密耦合。当我尝试这种方法时,存在一些问题:

您再次需要ChangeDetectorRef转接到super(...)通话

您需要紧密结合到transform方法的签名AsyncPipe

transform得到超级复杂,因为它不再只是需要一个字符串(参见前一点)

我不知道这是否正确使Angular调用超类的ngOnDestroy方法

再加上我忘记的一切。我觉得代码很讨厌,甚至共享它似乎也不明智。

复制源(不推荐)

正如评论者之一建议的那样,的来源AsyncPipe是开放的。因此,您可以采用它并以此构建自己的管道。

由于明显的原因,这不是明智的决定。


最重要的是,我现在对自己的问题的答案(尽管我很高兴地证明另一个答案是错误的!)是,这不容易实现,最好的解决方案是不解决任何问题:只需坚持使用二重奏模板。


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
author-avatar
聂依依mma
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有