首页 > 解决方案 > 如何在模块之间共享自定义验证器

问题描述

我根据本教程为模板驱动的表单构建了一个自定义密码验证器: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.

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

有任何想法吗?

标签: angulartypescriptangular-material2

解决方案


问题

这是每个Angular开发人员一开始都会犯的错误。问题是缺乏对模块如何在以下方面工作的Declaration理解ComponentDirectives

在您的情况下,您 aDirective并且您正在尝试在两个不同的模块中使用它,因此您必须在两个不同的Modules. 但是Angular开始抱怨你在不止一个中声明了相同的组件Module

现在开发人员所做的是将其转移Directive到更高的Module思想上,即它将在其所有孩子中都可用,Modules但等待它不会起作用。

使固定

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

换个角度想吧。我当前的Module导入是否都需要Modules包含DirectiveComponent. 在这种情况下,我们创建ShareModule包含所有重复使用的内容ComponentsDirectives并且我们只需在需要的地方导入它。

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

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


推荐阅读