标签: angular-forms

Angular 2 不会自动更新 FromGroup 值

我正在使用最近发布的 Angular 2.0.0,基本上我有一个组件来初始化它的表单模板的值,该模板由一个输入文本框和一个带有两个输入文本框的 FormGroup 的 formArray 组成。

初始化完成后,绑定工作正常,但是当我将新的 FormGroup 推送到 formArray 时,表单值不会反映新添加的项目,直到我在最初绑定的某个文本框中进行了一些值更改。为什么会出现这种行为,以及如何在添加某些动态 FormGroup 时更新表单值?

我的组件和模板代码是这样的:

//initialize the form values
//this_fb is the form builder
setControlsValues(){
  
   this.form_band = this._fb.group({

		name : [ 'test', [ Validators.required ] ],
		bands : this._fb.array([

			this._fb.group({

				name : [ 'band 1', [ Validators.required] ],
				score : 10
			}),
			this._fb.group({

				name : [ 'band 2', [ Validators.required] ],
				score : 8
			})
		])
   });  
}
  
//push a new FormGroup when user click button
addBand(){
  
  this.form_band.controls.bands.controls.push( 

    this._fb.group({

      name …
Run Code Online (Sandbox Code Playgroud)

angular-template angular angular-forms

6
推荐指数
0
解决办法
4325
查看次数

如何验证依赖于另一个窗体控件的反应性窗体控件?

Angular Form组件类为:

export class SpecsFilterFormComponent implements OnInit {

  specFilterForm: FormGroup;
  cameraSizeMin = new FormControl("", [Validators.pattern("\s*|[0-9.]*")]);
  cameraSizeMax = new FormControl("", [Validators.pattern("\s*|[0-9.]*")]);

  constructor(private fb: FormBuilder) {    }

  ngOnInit() {

  this.specFilterForm = this.fb.group({
  cameraSize: this.fb.group(
    {
      cameraSizeMin: this.cameraSizeMin,
      cameraSizeMax: this.cameraSizeMax,
    })
});

this.specFilterForm.valueChanges.debounceTime(500).filter(
  formData => this.specFilterForm.valid)
  .subscribe(
    formData => {
      console.log("do something after validation")
    });
  }
  }
Run Code Online (Sandbox Code Playgroud)

我想添加一个验证以确保cameraSizeMax> = cameraSizeMin,以及如何在控件的cameraSizeMin和cameraSizeMax中应用此验证。

angular2-forms angular angular-forms

6
推荐指数
1
解决办法
3652
查看次数

将formControlName用于反应形式的自定义输入组件

有一个自定义的输入组件,它以反应形式用于验证:

@Component({
    moduleId: module.id.toString(),
    selector: 'custom-select',
    templateUrl: 'custom-select.component.html',
    styleUrls: ['custom-select.component.css']
})
export class CustomSelectComponent {
    @Input() public items: SelectModel[];
    public model: SelectModel;
    constructor(private customSelectService: CustomSelectService) {
        this.customSelectService.Selected.subscribe((data: SelectModel) => {
            this.model = data;
        });
    }
    public newSelect(select: SelectModel): void {
        this.customSelectService.updateSelected(select);
    }
}
Run Code Online (Sandbox Code Playgroud)

效果很好,我正在custom-select以反应形式使用,并希望按如下所示进行验证:

<custom-select id="country" [items]="selectItems" formControlName="country"></custom-select>
<div *ngIf=" myFrom.controls['country'].invalid && (myFrom.controls['country'].dirty 
             || myFrom.controls['country'].touched) " class="ha-control-alert">
    <div *ngIf="myFrom.controls['country'].hasError('required')">Country is required</div>
</div>
Run Code Online (Sandbox Code Playgroud)

这就是我在组件中声明表格的方式

this.myFrom = this.formBuilder.group({
    country: [null, Validators.required],
})
Run Code Online (Sandbox Code Playgroud)

但是当我添加formControlName验证时,会出现错误,提示名称为'country'的表单控件没有值访问器。我该如何处理?

angular-validation angular angular-reactive-forms angular-forms

6
推荐指数
1
解决办法
5381
查看次数

与初始状态相同时,Angular 形成脏

我正在使用 angular 创建一个简单的输入表单,如下所示。

我想知道是否有人知道我可以跟踪的方法,如果用户更改控件值然后恢复到原始值,我会称之为“真实”脏状态与否。

所以加载我的“name”属性=“John”。

然后用户删除一个字符以使 name 属性“Jon”,现在我的 contactForm 很脏。

如果用户将光标放回并再次键入“h”name =“John”,即使处于原始状态,我的 contactForm 仍然脏?

import { FormControl } from '@angular/forms';
import { FormBuilder, AbstractControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { ContactDetail } from './../../../models/contact-details.model';
import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'contact-edit-edit-body',
  templateUrl: './contact-edit-edit-body.component.html',
  styleUrls: ['./contact-edit-edit-body.component.css']
})
export class ContactEditEditBodyComponent implements OnInit {
  @Input() contact: ContactDetail = new ContactDetail(0);

  contactForm: FormGroup;
  name: AbstractControl;
  phoneNumber: AbstractControl;
  emailAddress: AbstractControl;

  constructor(fb: FormBuilder) {
    this.contactForm = fb.group({
      "name": [this.contact.name], …
Run Code Online (Sandbox Code Playgroud)

angular angular-forms

6
推荐指数
1
解决办法
4426
查看次数

侦听嵌套表单组的表单控件内部的更改

export class ApplyComponent implements OnInit {
    formApply: FormGroup;
    postCodeInput: boolean = true;

    constructor(private fb: FormBuilder) {}
    ngOnInit() {
        this.formApply = this.fb.group({
            firstName: ["", Validators.required],
            currentUKAddress: this.fb.group({
                flat: ["", Validators.required],
                years: ["", Validators.required]
            })
        });
        this.onChanges();
    }

    onChanges(): void {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

我想听听岁月的变化。无论我在里面尝试了什么,我onChanges()都找不到为什么什么都不起作用......我试过:

- this.formApply.get('currentUKAddress.years').valueChanges.subscribe(data => {
            console.log('Form changes', data);
        })

 - this.formApply.controls.currentUKAddress.get('years').valueChanges.subscribe(data => {
            console.log('Form changes', data);
        })



- this.formApply.controls.currentUKAddress.controls['years'].valueChanges.subscribe(data => {
            console.log('Form changes', data);
        })
Run Code Online (Sandbox Code Playgroud)

以及其他东西。在所有情况下,我都会收到 Typescript 编译器错误: 属性不存在于类型 AbstractControlObject 可能为 null

forms typescript angular angular-forms

6
推荐指数
1
解决办法
6471
查看次数

如何正确扩展FormGroup

我目前正在尝试扩展Angular5的FormGroup类型,以实现一个自定义方法,以接收模型状态错误并将其显示到另一个自定义组件中。

不幸的是,我收到的信息不那么丰富:
Error: ServerValidatedForm/src/platform/svalidated/group.component.ts:30:1: Error encountered in metadata generated for exported symbol 'SVFormGroup': ServerValidatedForm/src/platform/svalidated/group.component.ts:33:22: Metadata collected contains an error that will be reported at runtime: Expression form not supported.

我怀疑TypeScripting本身缺少某些东西。值得高兴的是,我已经清理了node_modules,从项目中删除了所有元数据,然后再次进行了编译,每次遇到相同的错误时,都将重新进行编译。

我正在使用:
"@angular/animations": "5.0.1", "@angular/cli": "^1.5.0", "@angular/common": "5.0.1", "@angular/compiler": "^5.0.1", "@angular/compiler-cli": "^5.0.1", "@angular/core": "5.0.1", "@angular/forms": "^5.0.1"

重要的代码在这里,任何帮助将是有帮助的:

import { Injectable } from "@angular/core"; import { FormGroup } from "@angular/forms"; import { AbstractControlOptions } from "@angular/forms/src/model";

@Injectable()
export class SVFormGroup extends FormGroup {
  constructor(
    controls: {[key: string]: any},
    validatorOrOpts?: ValidatorFn|ValidatorFn[]|AbstractControlOptions|null,
    asyncValidator?: AsyncValidatorFn|AsyncValidatorFn[]|null) …
Run Code Online (Sandbox Code Playgroud)

metadata typescript angular-forms angular5

6
推荐指数
1
解决办法
1931
查看次数

如何禁用角度特定日期之前的所有日期?

我正在建立一个我总是想要endDate> startDate的组件(html,css,spec.ts,ts)。我按照此链接https://material.angular.io/components/datepicker/overview进行了多个日期选择。

以下是我针对startDate和的HTML endDate

开始日期:

<div class="start-date" fxFlex="50%" fxFlexOrder="1">
          <mat-form-field>
            <input matInput [matDatepicker]="picker1" placeholder="{{'PORTAL.STARTDATE' | translate}}" type="text" formControlName="startDate" [(ngModel)]="unavailability.startDate" [readonly]="!componentPermission.writePermission">
            <mat-datepicker-toggle matSuffix [for]="picker1"></mat-datepicker-toggle>
            <mat-datepicker #picker1></mat-datepicker>
          </mat-form-field>
        </div>
Run Code Online (Sandbox Code Playgroud)

结束日期:

<div class="end-date" fxFlex="50%" fxFlexOrder="2">
           <mat-form-field>
      <input matInput [matDatepicker]="picker2" placeholder="{{'PORTAL.ENDDATE' | translate}}" type="text" formControlName="endDate" [(ngModel)]="unavailability.endDate" [readonly]="!componentPermission.writePermission">
      <mat-datepicker-toggle matSuffix [for]="picker2"></mat-datepicker-toggle>
      <mat-datepicker #picker2></mat-datepicker>
   </mat-form-field>
        </div>
Run Code Online (Sandbox Code Playgroud)

现在下面是我validateForm在页面加载时调用方法的角度代码(ts)。

ngOnInit() {
    ....
    this.validateForm();
}

validateForm() {
    this.unavailabilityForm = this.formBuilder.group({
     'startDate': ['', Validators.required],
     'endDate': ['', Validators.required],
     'unavailabilityReason': ['']
    });
}
Run Code Online (Sandbox Code Playgroud)

问题陈述:

现在,我需要做的是-如果我选择了某个日期 …

html angular-material angular-components angular angular-forms

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

Angular4表单 - formGroup setValue到具有额外字段的模型

我有一个表单来更新角度4中现有模型类的字段的一部分.

我需要在当前模型实例上设置setValue,最后将值重新更新.

问题是我只需要更新模型的某些部分,但角形式会返回错误

"Cannot find form control with name 'fieldname'" 
Run Code Online (Sandbox Code Playgroud)

对于我不想编辑的额外字段.

获得所需行为的最佳选择是什么?

我想为我不希望在表单中更新的字段添加隐藏的formControls,但是我们的一些模型非常大,而我们需要用户只编辑它们的一部分.

我必须在最后获得一个更新的模型,用于我们的模型的脏检查和一般更新(与具有多个重复的类相关代码相比,仅用于设置所有formControls的值并从提交时的formControls更新模型)

谢谢.

更新只是为了澄清 - 我想要一个类似于此的行为:

--component.ts
model: Model = someModelWithData;

--component.html
<input type="checkbox" [(NgModel)]="model.FieldOne" />
Run Code Online (Sandbox Code Playgroud)

用户更改FieldOne中的值后,模型仍然已满,但所有其他数据都已更改,但FieldOne已更改.

angular angular4-forms angular-forms

6
推荐指数
2
解决办法
4665
查看次数

键入时进行 Angular 反应式表单验证

我正在处理此表单并希望在输入时进行验证。当前的行为是我选择输入,键入,当我单击其他站点时,它会显示错误。我认为当我设置控制、有效和脏时发生的错误,但我无法弄清楚。

打字稿

buildForm(): void {
 this.userForm = this.fb.group({
  'email': ['', [
    Validators.required,
    Validators.pattern('[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$')
  ]
  ],
  'password': ['', [
    Validators.required,
    Validators.minLength(6),
    Validators.maxLength(25)
   ]
   ],
 });
 this.userForm.valueChanges.subscribe(data => this.onValueChanged(data));
}

onValueChanged(data?: any) {
 if (!this.userForm) { return; }
 const form = this.userForm;
 for (const field in this.formErrors) {
  // clear previous error message (if any)
  this.formErrors[field] = '';
  const control = form.get(field);
  if (control && control.invalid && control.dirty) {
    const messages = this.validationMessages[field];
    for (const key in control.errors) {
      this.formErrors[field] += messages[key] …
Run Code Online (Sandbox Code Playgroud)

angular-material angular angular-reactive-forms angular-forms

6
推荐指数
2
解决办法
6391
查看次数

Angular Forms 错误:类上有两个不兼容的装饰器

我在编译表单项目时遇到问题:

\n
ERROR in Failed to compile entry-point @angular/forms (es2015 as esm2015) due to compilation errors:\n../../../node_modules/@angular/forms/fesm2015/forms.js:6219:1 - error NG1006: Two incompatible decorators on class\n\n6219 class MaxValidator extends AbstractValidatorDirective {\n     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n6220     constructor() {\n     ~~~~~~~~~~~~~~~~~~~\n ...\n6237     }\n     ~~~~~\n6238 }\n     ~\n../../../node_modules/@angular/forms/fesm2015/forms.js:6279:1 - error NG1006: Two incompatible decorators on class\n\n6279 class MinValidator extends AbstractValidatorDirective {\n     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n6280     constructor() {\n     ~~~~~~~~~~~~~~~~~~~\n ...\n6297     }\n     ~~~~~\n6298 }\n     ~\n../../../node_modules/@angular/forms/fesm2015/forms.js:6758:31 - error NG6001: The class 'MinValidator' is listed in the declarations of the NgModule '\xc9\xb5InternalFormsSharedModule', but is not a directive, …
Run Code Online (Sandbox Code Playgroud)

typescript angular angular-forms

6
推荐指数
1
解决办法
5784
查看次数