有没有办法制作双向绑定输入组件,也可以在组件内部进行验证?
我要实现的目标是拥有一个可以按如下方式排列的组件:
<form #f="ngForm">
<my-form-input [(inputModel)]="name" [inputField]="myFormInputName"></my-form-input>
<my-form-input [(inputModel)]="name2" [inputField]="myFormInputName2"></my-form-input>
...
<my-form-input [(inputModel)]="lastItem" [inputField]="lastItemName"></my-form-input>
</form>
我有以下设置,但无法弄清楚如何正确设置:
组件:
import {Component,Input, Output,EventEmitter} from 'angular2/core'
import {FORM_DIRECTIVES} from 'angular2/common';
@Component({
selector: 'my-form-input',
directives: [FORM_DIRECTIVES],
template:
`
<input type="text" class="form-control" id="i1" required [ngModel]="inputModel" (ngModelChange)="onChangeInput($event)" ngControl="ctrl" #ctrl="ngForm"/>
<p>{{"Is field valid? I would like to make some decisions here depending on that: "+ctrl.valid}}</p>
`
})
export class InputComponent {
constructor(){};
@Input() inputField:string;
@Input() inputModel: Object;
@Output() inputModelChange = new EventEmitter();
onChangeInput(event){
this.inputModel=event;
this.inputModelChange.emit(event);
}
}
该应用程序:
//our root app component
import {Component} from 'angular2/core'
import {FORM_DIRECTIVES} from 'angular2/common';
import {InputComponent} from './my.input'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<p>Is there a way to make a custom 2 way binding form input component having also validation?</p>
<form #f="ngForm">
<my-form-input [(inputModel)]="name" [inputField]="myFormInputName"></my-form-input>
<p>{{name}}</p>
</form>
</div>
`,
directives: [InputComponent,FORM_DIRECTIVES]
})
export class App {
constructor() {
this.name = 'Angular2'
}
}
我还做了一个Plunker来说明我的问题:http ://plnkr.co/edit/0vXjHbQmv7v7EKQcLWaa?p=preview
您可以将表单控件传递给组件以为输入创建专用控件。基于此新控件,当错误的valid
属性为时显示错误false
:
@Component({
selector: 'my-form-input',
directives: [FORM_DIRECTIVES],
template: `
<input type="text" class="form-control" id="i1"
[ngModel]="inputModel"
(ngModelChange)="onChangeInput($event)"
[ngFormControl]="formCtrl.controls[inputField]"/>
<p>Is field valid? I would like to make some decisions
here depending on that: {{formCtrl.controls[inputField].valid}}
</p>
`
})
export class InputComponent implements OnInit {
@Input() inputField:string;
@Input() formCtrl;
@Input() inputModel: Object;
@Output() inputModelChange = new EventEmitter();
ngOnInit() {
this.formCtrl.control.addControl(
this.inputField, new Control('', Validators.required));
}
onChangeInput(event){
this.inputModel=event;
this.inputModelChange.emit(event);
}
}
您需要使用该addControl
方法使整个表单的状态与您在输入组件中创建的控件一致。
在这种情况下,您可以使用ngControl
指令内联定义控件。我进行了一些测试,但无法以这种方式工作...
这是从父级组件使用此组件的方法:
@Component({
selector: 'my-app',
template: `
<form #f="ngForm">
<my-form-input [(inputModel)]="name" [inputField]="myFormInputName" [formCtrl]="f"></my-form-input>
</form>
`,
directives: [ FORM_DIRECTIVES, InputComponent ]
})
export class AppComponent {
}
启动后仍然是检查问题。表单的全局状态未更新,并发生以下错误:
Expression '
Valid : {{f.valid}} in AppComponent@1:24' has changed after it was checked. Previous value: '
Valid : true'. Current value: '
Valid : false'
要解决此问题,请查看基于ChangeDetectorRef
类及其detectChanges
方法的朱利安答案。
这是一个示例plunkr:https ://plnkr.co/edit/Z4uOUq2q4iXdpo0J6R1o ? p = preview 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句