自定义angular2表单输入组件,组件内部具有双向绑定和验证

安德里斯·克劳兹(Andris Krauze)

有没有办法制作双向绑定输入组件,也可以在组件内部进行验证?

我要实现的目标是拥有一个可以按如下方式排列的组件:

<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有双向绑定输入的Angular2组件不会触发更改事件

Angular2:父/子组件内部的双向绑定

Angular2 2路绑定中具有相同名称的自定义输入和输出

自定义可重用组件的Angular2数据绑定

Angular:子组件中自定义输入的2种方式的数据绑定

Angular 2 自定义验证不在组件函数内部调用

不确定如何对自定义组件在Angular上应用双向绑定

Angular 2侦听组件内部的自定义事件

如何编写依赖于Angular2中当前组件的属性值的自定义表单验证器(由模型驱动)

无法导入自定义组件-Angular2和TypeScript

Angular 6自定义输入组件

Angular2组件@Input双向绑定

Angular2的性能,具有很多输入元素,并且具有双向绑定

具有双向数据绑定的自定义视图

如何在智能表单组件中使用 react-hook-form 验证自定义输入?

Angular2:仅对具有数字的字段进行自定义验证

angular2自定义模板验证器具有过时的值

带有子组件和验证的Angular 2嵌套表单

具有自定义列的自定义Angular 6材质表组件

Angular 2自定义表单控件,以模板驱动方式具有多个输入

Angular 2模板驱动的表单,具有自定义输入

用于双向绑定的自定义组件的 qml 属性的默认强绑定

Angular Reactive Forms:是否可以创建包含“必须具备”验证的自定义表单控件组件?

如何在自定义组件angular 4中访问表单验证

Angular 2自定义表单输入

从父组件到子组件的angular2中的双向数据绑定

ZK:具有列表框的自定义组件未绑定SelectedItem

嵌套的自定义FormArray组件不与具有FormArrayName的子窗体绑定

Vue:自定义组件派生的自定义组件中的v模型和输入事件