【发布时间】:2017-04-20 02:40:22
【问题描述】:
我的应用程序中有一些数据绑定,它们绑定到提供程序,但现在我想添加一些表单验证。问题是当我开始尝试将[(ngModel)] 与表单验证一起使用时出现错误。
我得到的错误信息表明:
ngModel 不能用于向父级注册表单控件 formGroup 指令。尝试使用 formGroup 的合作伙伴指令 \"formControlName\" 代替。示例:
<div [formGroup]=\"myGroup\"> <input formControlName=\"firstName\"> </div> In your class: this.myGroup = new FormGroup({ firstName: new FormControl() }); Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions: Example: <div [formGroup]=\"myGroup\"> <input formControlName=\"firstName\"> <input [(ngModel)]=\"showMoreControls\" [ngModelOptions]=\"{standalone: true}\"> </div>
如果我让它独立([ngModelOptions]=\"{standalone: true})然后我开始收到错误(Template parse errors: Can't bind to 'ngModelOptions' since it isn't a known property of 'ion-input'.),但除此之外,表单验证似乎也不起作用。另一方面,如果我删除了 ngModel,那么数据将不再绑定到我的提供程序。
这是我的代码的一个非常简略的版本:
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { CaseProvider } from '../../providers/caseProvider';
@Component({
selector: 'page-form',
template: `
<ion-header>
</ion-header>
<ion-content>
<div [formGroup]="myFormGroup">
<ion-item>
<ion-label>Record number</ion-label>
<ion-input formControlName="record" [(ngModel)]="caseProvider.record"></ion-input>
</ion-item>
<button ion-button block (click)="saveCase()">
<span>Save</span>
</button>
</div>
</ion-content>
`
})
export class MyPage {
myFormGroup: FormGroup;
constructor(public formBuilder: FormBuilder, public caseProvider:CaseProvider) {
this.myFormGroup = formBuilder.group({
record: ['', Validators.compose([Validators.maxLength(30), Validators.pattern('.*[0-9].*')])]
});
}
saveCase(){
//save code here
}
}
如何将数据绑定到提供者(其中包含 getter 和 setter),并同时使用 formGroup 进行验证?
谢谢!
【问题讨论】:
-
你可以将它绑定到你的formControl,这是你应该做的。因此,当您构建表单(或使用patchValue)时,请在构建表单时设置formControlName ...例如
firstName:[showMoreControls, Validators.required]或您拥有的任何东西:) -
你能展示你的
html和ts你的组件代码吗? -
我已经更新了我的问题以显示我的一些代码。
-
@AJT_82 你是说有一种方法可以从表单组中绑定吗?看起来您的示例将第一个参数作为应该绑定的变量传递?我以为表单控件中传递的第一个参数是表单状态?
-
如果你有
caseProvider.record中的值,你可以像这样分配它:record: [this.caseProvider.record, Validators.compose([Validators.maxLength(30), Validators.pattern('.*[0-9].*')])]看看这个例子:stackoverflow.com/a/43279908/6294072