标签: reactive-forms

在ReactiveForm中设置Angular 2 FormArray值?

这里已经存在类似的问题(设置初始值Angular 2 reactive formarray)但我对答案不满意或者可能正在寻找其他解决方案.

我认为使用FormArray的重点是传递对象数组,它应该创建相同数量的组件.但是在上面的示例中,如果查看提供的plunker,即使提供了两个Addresses对象,也会创建一个Address,因为它的空白版本已经在ngOnInit()中创建.

所以我的问题是,如果在ngOnInit()我有这样的地址:this._fb.array([])//空白列表,那么我该如何设置它的值,它动态地从N个地址创建N个地址在我的TypeScript数组中?

javascript forms reactive-forms angular angular-reactive-forms

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

没有ControlContainer的提供者和ControlContainer的提供者

我正在使用Angular2处理应用程序.我试图在我的应用程序中使用Reactive Forms但我遇到了一些错误:

第一个错误是关于NgControl,如下所示:

没有NgControl的提供者("

div class ="col-md-8"[ERROR - >] input class ="form-control"id ="productNameId""):ProductEditComponent @ 16:24

第二个错误是关于ControlContainer,如下所示:

没有ControlContainer的提供者("div [ERROR - >] div formArrayName ="tags">

div class ="row">

按钮cl"):

Htmm文件如下:

 <div class="panel panel-primary">
   <div class="panel-heading">
      {{pageTitle}}
</div>

<div class="panel-body">
    <form class="form-horizontal"
          novalidate
          (ngSubmit)="saveProduct()"
          formGroup="productForm" >
        <fieldset>
            <div class="form-group" 
                 [ngClass]="{'has-error': displayMessage.productName }">
                <label class="col-md-2 control-label" for="productNameId">Product Name</label>

                <div class="col-md-8">
                    <input class="form-control" 
                            id="productNameId" 
                            type="text" 
                            placeholder="Name (required)" 
                            formControlName="productName" />
                    <span class="help-block" *ngIf="displayMessage.productName">
                            {{displayMessage.productName}}
                    </span>
                </div>
            </div>


 <div formArrayName="tags">
                <div class="row">
                    <button class="col-md-offset-1 col-md-1 btn btn-default" …
Run Code Online (Sandbox Code Playgroud)

html reactive-forms angular

8
推荐指数
1
解决办法
9061
查看次数

从表单控件Angular 6中删除验证器

我有一个包含很多表单控件和一些控件的验证器的表单,例如:

title = new FormControl("", Validators.compose([
    Validators.required
]));
description = new FormControl("", [
    Validators.required,
    Validators.minLength(1),
    Validators.maxLength(2000)
]);
Run Code Online (Sandbox Code Playgroud)

如何添加不验证控件的另存为草稿按钮?或删除它们?

我尝试了很多示例,例如:

saveDraft() {
   this.addProjectForm.controls.title.clearValidators();
   this.addProjectForm.controls.title.setErrors(null);
   this.addProjectForm.controls.title.setValidators(null);
}
Run Code Online (Sandbox Code Playgroud)

要么

saveDraft() {
   this.addProjectForm.controls['title'].clearValidators();
   this.addProjectForm.controls['title'].setErrors(null);
   this.addProjectForm.controls['title'].setValidators(null);
}
Run Code Online (Sandbox Code Playgroud)

但没有任何效果..

reactive-forms angular angular-forms angular-formbuilder

8
推荐指数
4
解决办法
9105
查看次数

FormControl / FormGroup / FormArray 值类型

我希望我的FormControl( FormGroup/ FormArray) 是强类型的,所以当我有例如

interface SomeSource {
  id: string;
  name: string;
}
Run Code Online (Sandbox Code Playgroud)

我把它变成了例如

let form = new FormGroup<SomeSource>({
  id: new FormControl('test id'),
  name1: new FormControl('test name')
});
Run Code Online (Sandbox Code Playgroud)

TypeScript 抛出了一个错误:在name上找不到FormGroup

同样在理想的世界中form.value应该是SomeSource类型(而不是any)。

问题是没有办法为任何AbstractFormControl孩子指定这个泛型类型。

我认为这很容易FormGroup用自己的界面覆盖。但是,有没有办法仅使用 Angular 来实现这一目标?如果没有,是否有第三方解决方案?

动机:我想轻松重构我的SomeSource. 目前,当我重构SomeSource界面时,表单未适配且未抛出错误 => 存在一些错误的空间。

typescript reactive-forms angular

7
推荐指数
1
解决办法
1831
查看次数

如何使用Observable初始化Reactive Angular2表单?

我的计划是将表单的值存储在我的ngrx商店中,以允许我的用户浏览网站并返回表单(如果他们愿意).我们的想法是,表单的值将使用可观察对象从商店重新填充.

这是我目前正在做的事情:

constructor(private store: Store<AppState>, private fb: FormBuilder) {
    this.images = images;
    this.recipe$ = store.select(recipeBuilderSelector);
    this.recipe$.subscribe(recipe => this.recipe = recipe); // console.log() => undefined
    this.recipeForm = fb.group({
      foodName: [this.recipe.name], // also tried with an OR: ( this.recipe.name || '')
      description: [this.recipe.description]
    })
  }
Run Code Online (Sandbox Code Playgroud)

商店给出了一个初始值,我已经看到它正确地通过我的选择器函数,但是当我的表单被创建时,我不认为该值已经返回.因此this.recipe仍未定义.

这是错误的方法,还是我能以某种方式确保在创建表单之前返回observable?

observable typescript ngrx reactive-forms angular

7
推荐指数
2
解决办法
4921
查看次数

PrimeNg ui-float-label 在反应形式 patchValue() 后不浮动

我有用于创建和编辑操作反应式表单。对于编辑,我只是在表单上,​​就像一个魅力,来自 PrimeNg InputText 组件的浮动标签没有注意到有值填充。当我单击其中一个输入然后对其进行模糊处理时,每个输入都会更新视图并且所有标签都在顶部。patchValue(data)

在此处输入图片说明 在此处输入图片说明

我已经尝试过更改检测(视图组件将其设置为OnPush), markAsDirty()markAllAsTouched()即使标签仍然在输入值上。不知道如何在其中一个控件上触发类似于物理模糊的 smth(不想在代码中触发它,@ViewChild()因为它对我来说看起来是错误的解决方案。

任何想法如何解决这一问题?

primeng reactive-forms angular angular-reactive-forms

7
推荐指数
1
解决办法
548
查看次数

在Angular 2中创建可选的嵌套表单组

我试图在Angular 2中实现一个模型驱动的表单.我的数据模型的结构如下:

archive (FormGroup)
    name (FormControl)
    description (FormControl)
    connection (FormGroup)
        url (FormControl)
        authentication (FormGroup)
            username (FormControl)
            password (FormControl)
Run Code Online (Sandbox Code Playgroud)

在此数据模型中,顶级名称是必需的,但描述字段是可选的.我可以应用必需的验证器来命名,并省略描述中的验证器.

对于连接,我希望它是可选的,但如果存在连接,则其URL成为必需.类似地,对于连接的身份验证模型:它是可选的,但如果存在,则需要用户名和密码.

我试图了解如何设置验证器来强制执行这些规则.我试过从连接表单组中省略任何验证器,但这似乎要求我建立连接.我已经看过在线教程,解释了如何在嵌套表单组上实现自定义验证,但没有描述如何使整个嵌套表单组可选.

有没有一种直接的方法来使用Angular 2 FormGroup实现此模型?

reactive-forms angular

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

在索引 0 处初始化没有空输入的表单数组

我目前正在使用 angular 2 和反应式表单构建更新、添加、删除和编辑表单。我已将控件分组到一个表单构建器数组中,以将输入控件动态添加到表单数组中。这适用于没有任何要初始化的项目的空表单。

export class ItemsPage{

   collectionForm: FormGroup;
   get items(): FormArray { return <FormArray>this.collectionForm.get('items'); }

   constructor(public formBuilder: FormBuilder){

        this.pageDetails = this.navParams.data;

        this.collectionForm = this.formBuilder.group({
           items: this.formBuilder.array([this.buildItem()])
        });
   }

   buildItem(item?: string): FormGroup {
       return this.formBuilder.group({ item: [item || '', Validators.required] });
   }

   ionViewDidLoad() {
       // Builds a form with pre populated items 
       forEach(this.pageDetails, value => {
           this.items.push(this.buildItem(value));
       })
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是视图中的控件列表在index 0whenthis.pageDetails有一个值列表时包含一个空输入。这可以在 constructor with 中删除

this.items.removeAt(0);
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不对。我想也许我可以在它的formBuilder.array

let prebuildItems = forEach(this.pageDetails, value => { // …
Run Code Online (Sandbox Code Playgroud)

reactive-forms angular

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

如何在ngFor中使用反应形式

用户数组可以具有多个元素(用户)。在模板中,我遍历此数组并为每个元素添加一个表单。现在,每个表单都绑定到相同的表单组值。如果我为第一个用户填写表格,则所有表格的提交按钮都将启用。如何将每个表单指向唯一的formGroup或唯一的变量?

零件:

import { FormControl, FormGroup, Validators, FormBuilder} from '@angular/forms';
...
export class UserComponent implements OnInit {
 form: FormGroup;
 @input users: any[];

 constructor(private _fb: FormBuilder) {}
 ngOnInit() {
  this.form = this._fb.group({
   address: new FormControl('', [Validators.required]),
   phone: new FormControl('', [Validators.required]),
   });
 }

 add() {
   if (this.form.valid){
     // code
   }
 }
Run Code Online (Sandbox Code Playgroud)

模板:

 <div *ngFor="let user if users">
  {{user.name}}
    <form [formGroup]="form"  (ngSubmit)="add()">         
     <div class="form-group">
       <label>Address:</label>
       <input formControlName="address" class="form-control">
       <label>Phone:</label>
       <input formControlName="phone" class="form-control"></input>
     </div>
     <button type="submit" class="submit" [disabled]="!form.valid">Submit</button>    
    </form>
 </div>
Run Code Online (Sandbox Code Playgroud)

reactive-forms angular angular-reactive-forms

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

角度单选按钮与模型不同步

我遇到了一个问题,当后续问题中存在相同的标签时,我的单选按钮(视图)与我的模型(反应形式)不同步。

我正在创建某种调查应用程序,其中(当然)包含多个问题,但是当 2 个后续问题在不同位置包含相同的答案标签时,在选择其中一个问题并在 2 个问题之间导航时,视图会不同步。我创建了一个Stackblitz来说明这个问题。(没有材料的相同Stackblitz

复制步骤错误选择:

  1. 选择问题 1 的第二个选项 ('MRX')。
  2. 单击“下一步”按钮(答案存储在模型中)。
  3. 再次为问题 2 选择第二个选项('Ibanez')。
  4. 单击“上一个”按钮(答案存储在模型中)。
  5. 再次单击“下一步”按钮。
  6. 现在您可以看到视图与模型不同步(模型也打印在屏幕上)。

繁殖步骤双选:

  1. 选择问题 1 的第一个选项 ('Ibanez')。
  2. 单击“下一步”按钮(答案存储在模型中)。
  3. 选择问题 2 的第二个选项('Inbanez')。
  4. 单击“上一个”按钮(答案存储在模型中)。
  5. 现在您可以看到选择了 2 个选项(第一个和第二个)。

有关该应用程序的更多信息,我已在 stackblitz 的父组件 (survey-parent.component.html) 中添加了说明。

我不确定这是 Angular 中的错误还是我在这里做错了什么。

parent-child reactive-forms angular

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