【问题标题】:How to share custom validators between modules如何在模块之间共享自定义验证器
【发布时间】:2018-10-27 00:06:33
【问题描述】:

我已经根据本教程为模板驱动的表单构建了一个自定义密码验证器:https://juristr.com/blog/2016/11/ng2-template-driven-form-validators/#building-a-custom-validator

但是,我想在应用程序不同部分的多个表单上使用它。我不断收到错误:

Type PasswordValidator is part of the declarations of 2 modules: 
SignupModule and AuthModule! Please consider moving PasswordValidator to a higher module that imports SignupModule and AuthModule.

如果我按照它的建议将验证器添加到更高的模块,它就不再起作用了。验证器永远不会到达。好像需要在直接持有表单的模块中导入才有效。

有什么想法吗?

【问题讨论】:

  • 只需从两者中删除PasswordValidator,即SignupModule and AuthModule,而是将其添加到根模块中,以便您可以在整个应用程序中使用它
  • 或者为什么不创建一个SharedModule 将这个验证器导出到任何导入这个 SharedModule 的模块?
  • ^我尝试了这两种方法,这就是我所说的“如果我按照它的建议将验证器添加到更高的模块”

标签: angular typescript angular-material2


【解决方案1】:

问题

这是每个Angular 开发人员一开始都会遇到的错误。问题是缺乏对模块在DeclarationComponentDirectives 方面的工作原理的理解

在您的情况下,您是 Directive,并且您试图在两个不同的模块中使用它,因此您在两个不同的 Modules 中声明。但是Angular 开始抱怨您在多个Module 中声明了相同的组件。

现在开发人员所做的是将Directive 移动到更高的Module,认为它将在其所有子级Modules 中可用,但等待它不会起作用。

修复

这里的实际问题是我们对模块导入的看法。我们认为如果我们有更高级别的DirectivesComponent,它将在其所有子级中可用,但不一定(取决于执行顺序)。

换个角度想。我当前的Module 是否导入所有必需的Modules,其中包含DirectiveComponent。在这种情况下,我们创建了包含所有重复使用的ComponentsDirectivesShareModule,我们只需将其导入到需要的任何位置。

简而言之,创建一个SharedModule 并在其中声明您的公共DirectivesComponents 并在需要的地方导入此Module

请参考这篇关于共享模块的不错的官方文章 - https://angular.io/guide/sharing-ngmodules

【讨论】:

  • 我之前曾通过其他堆栈溢出答案尝试过这种方法,但我无法让它工作,但是您提供的文章告诉我,我之前缺少的是 exports。谢谢!
  • 你好苏尼尔!不是要威胁你或任何东西,但你能否详细说明为什么你必须重申这个问题,而你可以直截了当而不是拐弯抹角?感谢您提供非常丰富的答案!这可以帮助其他正在努力学习 Angular 的人。
  • 嗨,Edric,感谢您提出这个问题。有几个理由重申你的问题。 [1]。有时我们在查看他们的问题后回答,最终他们将主题拖到其他地方。因此,请始终确保我是根据自己的理解来回答的。 [2]。它可以帮助其他人了解针对什么查询给出了什么答案。注意:我不是内容作者 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2016-04-20
  • 2011-06-02
相关资源
最近更新 更多