将angular2表单指令应用于自定义输入表单元素

时间:2016-02-26 09:01:58

标签: twitter-bootstrap angularjs-directive angular angular2-forms

我想创建一个自定义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

3 个答案:

答案 0 :(得分:3)

我认为有两种方法可以实现:

  • 将您的控件作为自定义组件的参数

    @Component({
      selector: 'inputCustom',
      template: `
        <input [ngFormControl]="control"/>
      `
    export class FormFieldComponent {
      (...)
      @Input()
      control: Control;
    }
    

    这样您的输入将自动获取父组件中定义的表单的一部分。

  • 实施符合ngModel标准的组件。实施起来要长一些(您需要在自定义指令中实现并注册ControlValueAccessor),但这样您就可以直接使用ngFormControlngModel在您的自定义组件上。

    <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;

另见https://github.com/angular/angular/issues/2543

答案 2 :(得分:0)

实现自定义输入表单元素的Angular 2材料是了解如何实现ValueAccessor的重要信息来源。

所以只需深入了解源代码并查看输入组件: https://github.com/angular/material2