我想创建一个自定义InputCustom
组件,并使用它来创建模型驱动的表单。
我的自定义组件只包含一个输入字段,并使用Bootstrap material design
来表示感觉。
@Component({
selector:'inputCustom',
template:`
<div class="form-group label-floating is-empty">
<label class="control-label" for="input">Type here</label>
<input class="form-control" id="input" type="text">
<p class="help-block">Some help text</p>
<span class="material-input"></span>
</div>
`})
class InputCustom{....}
在 Angular2 中创建模型驱动的表单
<form [ngFormModel]="formRef">
<input type ="email" ngControl="email">
</form>
表单元素上的所有Controls
都已注册到ControlGroup
。通过使用 formRef ,您可以跟踪控制器内的字段值。
@Component({...})
class FormController{
formRef: ControlGroup;
constructor(...){
this.form.valueChanges.subscribe(data => console.log('changes', data));
}
}
现在,我希望人们像这样使用我的组件
<form [ngFormModel]="formRef">
<inputCustom type ="email" ngControl="email">
</form>
Q1:我是否需要编写自己的自定义ngControl
指令?
Q2:如何将ngControl
传播到由<input>
包裹的内部<inputCustom>
元素?
问题3:我应该如何在周围的表格Control
中注册我的ControlGroup
?
答案 0 :(得分:3)
我认为有两种方法可以实现:
将您的控件作为自定义组件的参数:
@Component({
selector: 'inputCustom',
template: `
<input [ngFormControl]="control"/>
`
export class FormFieldComponent {
(...)
@Input()
control: Control;
}
这样您的输入将自动获取父组件中定义的表单的一部分。
实施符合ngModel标准的组件。实施起来要长一些(您需要在自定义指令中实现并注册ControlValueAccessor
),但这样您就可以直接使用ngFormControl
和ngModel
在您的自定义组件上。
<inputCustom type ="email" [ngFormControl]="email">
有关详细信息,请参阅此问题:Angular 2 custom form input
我认为这篇文章会引起你的兴趣:
答案 1 :(得分:2)
我想自定义ValueAccessor应该这样做。
请参阅
- https://plnkr.co/edit/Bz7wLC5qq7s6Fph1UwpC?p=preview(DI提供的值访问器)
providers: [provide(NG_VALUE_ACCESSOR, {useClass: UIDropdownComp, multi: true})]
})
export class UIDropdownComp implements ControlValueAccessor {
- http://plnkr.co/edit/slVMz6Kgv6KlnUNMDe3o?p=preview(注入组件的ngControl和“手动”分配的值访问器
export class Address implements ControlValueAccessor{
addressForm: ControlGroup;
value:any;
addressForm: ControlGroup;
constructor(@Optional() ngControl: NgControl, elementRef: ElementRef,fb: FormBuilder) {
ngControl.valueAccessor = this;
答案 2 :(得分:0)
实现自定义输入表单元素的Angular 2材料是了解如何实现ValueAccessor的重要信息来源。
所以只需深入了解源代码并查看输入组件: https://github.com/angular/material2