标签: angular-reactive-forms

Angular 反应式表单:使用单个 formControlName 同步多个输入

我正在 Angular 11 中构建一个反应式表单。它分为多个 div,项目所有者希望在每个 div 中进行一些重复输入,以便用户可以编辑某个字段 A 和所有 div 的输入' 字段 A 的输入将显示更新后的值。

我喜欢科里兰的方法:

<input [formControl]="myCtrl" [value]="myCtrl.value" />
<input [formControl]="myCtrl" [value]="myCtrl.value" />
<input [formControl]="myCtrl" [value]="myCtrl.value" />
Run Code Online (Sandbox Code Playgroud)

formControlName...但我想用而不是实现这一点,formControl以便我可以利用formGroups (而不是让每个表单控件成为我的组件对象的成员)。然而,缺乏对实际的引用myCtrl会破坏 处的绑定[value]。

有没有一个好的策略让我仅按名称指定表单控件并使所有这些输入都使用单个控件?或者,当有很多不同的集合需要同步时,是否有一种不同的好方法来同步 Angular 反应形式的输入?

angular angular-reactive-forms angular11

5
推荐指数
1
解决办法
6482
查看次数

反应式表单无法与 ControlValueAccessor 一起使用

我已经构建了一个名为 的控件TextBox,为了简单起见,我将只在此发布该控件的相关部分。

    @Component({
      selector: 'app-textbox',
      template:
      `
        <input [(ngModel)]="value" [disabled]="disabled" />
      `,
      styleUrls: ['./textbox.component.css']
    })
    export class TextboxComponent implements OnInit, ControlValueAccessor {
    
      constructor() { }
      writeValue(obj: any): void {
        this._value = obj;
      }
      registerOnChange(fn: any): void {
        this.onChange = fn;
      }
      registerOnTouched(fn: any): void {
        this.onTouch = fn;
      }
      setDisabledState?(isDisabled: boolean): void {
        this.disabled = isDisabled;
      }
    
      disabled = false;
    
      onChange:()=>{}
      onTouch:()=>{};
    
      private _value:string;
      public get value():string {
        return this._value
      } 
      public set value(value:string){
        this._value = value;
      } …
Run Code Online (Sandbox Code Playgroud)

typescript angular angular-reactive-forms angular-forms

5
推荐指数
1
解决办法
3579
查看次数

错误:formGroup 需要一个 FormGroup 实例。请传入一份。 反应式形式 Angular

我在 Angular 版本 10 中使用反应式表单。但出现以下错误。

\n
ERROR Error: formGroup expects a FormGroup instance. Please pass one in.\n\n       Example:\n\n       \n    <div [formGroup]="myGroup">\n      <input formControlName="firstName">\n    </div>\n\n    In your class:\n\n    this.myGroup = new FormGroup({\n       firstName: new FormControl()\n    });\n    at Function.missingFormException (forms.js:1700:1)\n    at FormGroupDirective._checkFormPresent (forms.js:5632:1)\n    at FormGroupDirective.ngOnChanges (forms.js:5454:1)\n    at FormGroupDirective.rememberChangeHistoryAndInvokeOnChangesHook (core.js:2373:1)\n    at callHook (core.js:3285:1)\n    at callHooks (core.js:3251:1)\n    at executeInitAndCheckHooks (core.js:3203:1)\n    at selectIndexInternal (core.js:6324:1)\n    at \xc9\xb5\xc9\xb5advance (core.js:6306:1)\n    at PatientInformationComponent_Template (template.html:39:34)\n
Run Code Online (Sandbox Code Playgroud)\n

我的示例 HTML 代码如下。

\n
<div [formGroup]="MyForm">\n      <input formControlName="firstName">\n      <input formControlName="lastName">\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n

我的TS代码:

\n
export …
Run Code Online (Sandbox Code Playgroud)

html typescript angular angular-reactive-forms

5
推荐指数
1
解决办法
1万
查看次数

Angular 2自定义验证器,用于检查何时需要两个字段之一

我正在尝试实现自定义验证器功能来检查是否输入了电话号码(家庭电话和移动电话).我想在两个字段上显示错误消息,当它们被触摸并且没有有效值时,由于某种原因我的代码没有按预期工作.请帮帮我这篇文章.-谢谢!这是stackblitz链接https://stackblitz.com/edit/angular-ve5ctu

createFormGroup() {
   this.myForm = this.fb.group({
     mobile : new FormControl('', [this.atLeastOnePhoneRequired]),
     homePhone : new FormControl('', [this.atLeastOnePhoneRequired])
   });
}

atLeastOnePhoneRequired(control : AbstractControl) : {[s:string ]: boolean} {
  const group = control.parent;
  if (group) {
    if(group.controls['mobile'].value || group.controls['homePhone'].value) {
      return;
    }
  }
  let errorObj = {'error': false};
  return errorObj;
}
Run Code Online (Sandbox Code Playgroud)

angular-validation angular angular-reactive-forms

4
推荐指数
1
解决办法
2679
查看次数

没有名称为'dateTime'的表单控件的值访问器

我正在尝试将外部库应用于日期时间选择器.我收到如下错误

ERROR Error: Uncaught (in promise): Error: No value accessor for form control with name: 'dateTimeDeparture'
Error: No value accessor for form control with name: 'dateTimeDeparture'
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

模板:

<owl-dateTime-input [(ngModel)]="flightDetails.dateTimeDeparture" name="dateTimeDeparture" [locale]="en" required></owl-dateTime-input>  
Run Code Online (Sandbox Code Playgroud)

零件:

this.en = {
    firstDayOfWeek: 0,
    dayNames: ["Sunday", "Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Saturday"],
    dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    monthNames: [ "January","February","March","April","May","June","July","August","September","October","November","December" ],
    monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
};

this.flightDetails = {
    dateTimeDeparture: new Date(2017, 8, …
Run Code Online (Sandbox Code Playgroud)

datetimepicker angular angular-reactive-forms angular4-forms

4
推荐指数
1
解决办法
9349
查看次数

form.valueChanges不会为禁用的控件发出值

我有一个Angular Reactive表单.我订阅了它的值更改,并将对父组件发出更改.某些控件可能会被用户禁用.问题是,在发出表单valueChanges时,缺少来自禁用控件的值.我已经设定了一个基本的例子.

选中该复选框并禁用电子邮件输入时,不会记录任何表单控件值.但是我希望获得所有表格值.

angular angular-reactive-forms

4
推荐指数
1
解决办法
2146
查看次数

角度反应形式,添加和删除字段?

虽然在角度5中构建crud应用程序我遇到了一个问题,我如何使用相同的表单生成器但是根据我的需要更改我得到的控件,通过表单添加或更新用户...

这里有一些简单的代码,我会尽量不使事情变得复杂,因为我有很多属性很大的形式......

所以在我的app.component.html我有表格

         <form class="form-horizontal" [formGroup]="form" #myForm="ngForm" 
          (ngSubmit)="save()"> 
                <div class="form-group">
                    <label for="firstName" class="control-label 
                  required">First name</label>
                    <input type="text" id="firstName" class="form-control" 
             formControlName="firstName">


                </div>

                <div class="form-group">
                    <label for="lastName" class="control-label 
            required">Last name</label>
                    <input type="text" id="lastName" class="form-control" 
            formControlName="lastName"> 
                </div>
Run Code Online (Sandbox Code Playgroud)

在我的app.component.ts中

在我的构造函数中我有

    this.form = this.formBuilder.group({ 
        firstName: ['', [Validators.required, Validators.minLength(2), 
   Validators.pattern(/^[a-zA-Z]+$/)]],
        lastName: ['', [Validators.required, Validators.minLength(2), 
   Validators.pattern(/^[a-zA-Z]+$/)]],

    });
Run Code Online (Sandbox Code Playgroud)

和save()函数用于提交表单

    save() {
    let formModel = this.form.value;
    formModel.id = this.Id;

    if (this.Id == null) { 
        this._usermanagementservice.addEmployee(formModel).subscribe(() => {

           //function that reloads table with employees
            this.LoadAllEmployees();
        });
    }
    else {
        this._usermanagementservice.updateEmployee(this.Id, …
Run Code Online (Sandbox Code Playgroud)

angular angular-reactive-forms

4
推荐指数
2
解决办法
1万
查看次数

角度材料:重置反应形式显示验证错误

我正在使用angular5 reactivemodule在我的应用程序中显示一个表单.我还使用了必需的验证器,随后将该字段设置为红色并向用户显示错误信息.

它按预期工作,但是当我使用重置表单时

this.form.reset()

表单显示了需要特定字段的验证错误.我还使用form.markAsPristine()或form.markAsUntouched()来使其工作,但在应用多个可能的对的组合后问题仍然存在.

example.html的

<form [formGroup]="checkForm" (ngSubmit)="submitForm()">
  <mat-form-field>
    <input matInput formControlName="name" placeholder="name" />
    <mat-error *ngIf="checkForm.get('name').errors?.required">
      Name is required.
    </mat-error>
  </mat-form-field>
  <mat-form-field>
    <input matInput formControlName="email" placeholder="email" />
    <mat-error *ngIf="checkForm.get('email').errors?.required">
      Name is required.
    </mat-error>
  </mat-form-field>
  <button [disabled]="checkForm.invalid" type="submit">add</button>
</form>
Run Code Online (Sandbox Code Playgroud)

example.ts

checkForm  = this.formBuilder.group({
  'name': ['', Validators.required],
  'email': ['', Validators.required]
});

submitForm() {
   this.checkForm.reset();
   // this.checkForm.markAsPristine();
   this.checkForm.markAsUntouched();      
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

reset angular angular-reactive-forms

4
推荐指数
2
解决办法
7491
查看次数

无法重置包含选择的反应形式

我正在使用角度6

我的HTML是

<form [formGroup]="myForm" >
  <label>
    <input type="text" formControlName="name" placeholder="name" required autofocus >
  </label>
  <label>
    <select name="drop" formControlName="drop">
      <option value="developer"selected >developer</option>
      <option value="designer">designer</option>
      <option value="admin">admin</option>
    </select>
  </label>
</form>
Run Code Online (Sandbox Code Playgroud)

即使我selected在option页面首次加载时在“开发人员”中进行设置,也未选择“开发人员”。我想这是一个小角度的错误,无法正确呈现html,因此我在定义表单时放入了组件:

  myForm = this.formBuilder.group({
    name:['',Validators.required],
    drop:['developer']
  });
Run Code Online (Sandbox Code Playgroud)

而且有效。

真正奇怪的是,当我this.myForm.reset();在另一个位于窗体外部的按钮内执行操作时,“名称”应为空,但下拉列表也完全为空,只是空白,但应显示“ developer”,对吗?

该按钮隐藏了一些元素,应该重置表单,它在表单外部并且确实

  getOtherData(id){
    this.myForm.reset();
Run Code Online (Sandbox Code Playgroud)

这行不通,所以我必须做

this.myForm.setValue({
  name: '',
  drop: 'developer'
});
Run Code Online (Sandbox Code Playgroud)

为了实际重置表格。这是怎么错的select用组合reset?我想使用reset一次并完全重置表单,而不会出现“ hacks”,该怎么办?

谢谢

forms angular angular-reactive-forms angular6

4
推荐指数
1
解决办法
3017
查看次数

即使表单未通过验证,组件加载时反应形式的Angular 7设置值也会启用保存按钮

我有以下问题。单击以检查堆栈闪电。

我在构造函数中设置了反应形式:

this.formGroup = this.fb.group({
      'family_name_en': new FormControl('', Validators.required),
      'family_name_ar': new FormControl('', [Validators.required, Validators.pattern('[\u0600-\u06FF ]*')]),
      'unit_id': new FormControl({ value: '', disabled: true }, [Validators.required])
});
Run Code Online (Sandbox Code Playgroud)

而且ngOnInti(),我正在获取与关联的数据unit_id。

当我将数据从平台迁移到另一个平台时,不建议使用阿拉伯语的姓氏,但现在是这样。因此,大多数数据将不使用阿拉伯文名称加载。

问题是该按钮始终处于启用状态,而我需要做的是,如果用户要更新此unit_id按钮,则他应该添加阿拉伯语名称,以便随后启用该按钮。

如果表单有效,则启用按钮在加载组件时不会造成伤害。

这是getData()获取数据并设置表单组控件值的方法:

ngOnInit() {
    this.getDataById();
}
Run Code Online (Sandbox Code Playgroud)

getDataById():

getDataById() {
    this.showSpinner = true;
    this.auth.getDataById(this.unit_id).subscribe(
      (data) => {
        if (data['info'][0]['total'] == 1) {
          this.noDataBool = false;
          this.showSpinner = false;
          this.family_name_en = data['info'][0]['hh_last_name_en'];
          this.formGroup.controls['family_name_en'].setValue(this.family_name_en);
          this.family_name_ar = data['info'][0]['hh_last_name_ar'];
          this.formGroup.controls['family_name_ar'].setValue(this.family_name_ar);
          this.unit_id = data['info'][0]['unit_id'];
          this.formGroup.controls['unit_id '].setValue(this.unit_id);
    }
} …
Run Code Online (Sandbox Code Playgroud)

angular angular-reactive-forms angular6 angular7

4
推荐指数
1
解决办法
6467
查看次数