Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 当在自定义控件的范围内时,如何访问在被动表单组中声明的验证器?_Angular_Typescript_Validation_Angular Reactive Forms - Fatal编程技术网

Angular 当在自定义控件的范围内时,如何访问在被动表单组中声明的验证器?

Angular 当在自定义控件的范围内时,如何访问在被动表单组中声明的验证器?,angular,typescript,validation,angular-reactive-forms,Angular,Typescript,Validation,Angular Reactive Forms,我有一个定制组件(我很满意),并以这样的反应形式使用它 private init() { const control4 = new FormControl("yy", Validators.pattern(".{2}")); const control5 = new FormControl("zz", Validators.pattern(".{3}")); this.form = new FormGroup({ c4: control4, c5: control5

我有一个定制组件(我很满意),并以这样的反应形式使用它

private init() {
  const control4 = new FormControl("yy", Validators.pattern(".{2}"));
  const control5 = new FormControl("zz", Validators.pattern(".{3}"));

  this.form = new FormGroup({
    c4: control4,
    c5: control5
  });
}
错误消息发生在主组件中,我可以在那里访问错误。但是,我想在自定义组件中添加一些功能,以应对其无效

<input id="c4" formControlName="c4">
<app-textbox formControlName="c5"></app-textbox>

我知道这不是最好的方法,但至少是:

如果您想访问自定义组件(子组件)中的FormGroup,只需将Main组件的FormGroup(this.form)作为@输入传递给自定义组件即可。。。然后您将可以从变量访问整个数据库


捕捉主组件的表单,如
@Input()表单:FormGroup在您的孩子体内(TextBoxComponent)

这可以通过使用注射器和适当的挂钩来完成,导入注射器和NgControl并执行以下操作:

constructor(private injector: Injector) {}

ngAfterViewInit() {
  const ctrl = this.injector.get(NgControl, null)
  console.log(ctrl)
}
ctrl-there将为自定义控件指定窗体控件指令。这可能是表单控件名、表单控件或表单组等。一旦出现,您就必须弄清楚并处理您感兴趣的情况(可能是jsut表单控件和表单控件名)。您可以访问该控件及其方法/属性以及任何父级

或者,您可以注入ControlContainer:

构造函数(私有ctrl:ControlContainer){}


也许瓦纳马克是可选的,尽管如此。这将为您提供父窗体组指令,该指令可以访问所有相同的内容。

Hi,您是否实现了ControlValueAccessor的接口,如“writeValue”、“registerOnChange”、“registerOnTouched”等?因为这样您就可以对正在使用的表单组进行完全访问控制。。。您还可以将主FormGroup解耦为两部分:一个MainComponent的FormGroup和另一个ChildComponent的FormGroup,并将它们合并到MainComponent的ngAfterViewInit方法中。@PedroB。是的,我实现了接口
ControlValueAccessor
,它按预期工作(自定义组件中的更改在声明表单组的表单组件中正确传播)。现在,您说我可以完全访问与我一起工作的表单组。这是来自自定义组件吗?我不知道怎么做。我检查了所有我能找到的东西。。。请帮忙?我现在唯一的想法是,如果你想访问自定义组件中的表单,只需将main组件的FormGroup(this.form)作为@Input…@PedroB传递给自定义组件。这其实是个好主意,比我以前的好。至于我的确切问题,那就不行了。我想知道我是否只能通过对表单组的控件进行响应的能力来访问自定义控件中表单组控件的验证器。这很可能是不可能的,但我还是想和社区核实一下。请将您的评论作为回答予以接受。过几天我会发一份赏金,如果没有人能提出比你的建议更好的建议,你可以接受。很好。作为答案的一部分,这绝对是一个值得保留的变通方法,因此+1。在实际情况中,我们需要传递实际的FormControl(即组件响应),而不是FormGroup(即表单)。当我使用您的建议时,我注意到了限制,我的组件不知道哪些验证器与此相关,呵呵。你的答案仍然有效,但需要一点思考(而不仅仅是抄袭),这让我很高兴。这是一个相当高级的答案。好东西。我以前没有使用过Injector或ControlContainer,至少没有明确使用过。你能解释一下它们吗?这样无知的开发者就可以在这两者之间做出选择了。注入器只是一个角度注入器,但它允许你延迟注入器。这在这里是必需的,因为在视图初始化之前,NgControl指令在这里不可用。如果尝试正常注入,则会出现静态注入器错误。ControlContainer是保存当前指令的最顶层父控件。您可以正常地注入它,因为它在树中比实际控件高。更合适的一个取决于你想要什么,控制?然后使用喷油器和ng控制。整个表单组?使用controlcontaineral因此,在本解释中,我可能认为这是理所当然的一件更低级的事情,指令实例总是可以像服务实例一样注入子元素。它们是根据它们在组件树中的位置提供的。这就是我们在这里所做的,注入formGroup或formControlName指令。表单控件名只需要延迟,因为它位于您试图将其注入的组件上,所以它会同时初始化。容器已经初始化,因此可以安全地注入。
constructor(private injector: Injector) {}

ngAfterViewInit() {
  const ctrl = this.injector.get(NgControl, null)
  console.log(ctrl)
}