标签: angular-forms

反应式表单无法与 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
查看次数

Angular:为<select>设置选定的值

我有<select>异步加载的数据集.我使用hot observable,因为数据可以及时改变.问题是我无法设置选定的值,并且Angular也没有指向第一个元素(在用户执行之前没有设置值).我正在尝试订阅我自己的观察结果......它不起作用,我想知道为什么?我怎么解决这个问题?

PLNKR:https://plnkr.co/edit/uDmTSHq4naYGUjjhEe5Q

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
    </div>
    <select [(ngModel)]="selectedValue">
      <option *ngFor="let value of (values$ | async)"
              [value]="value">{{ value }}
      </option>
    </select>
  `,
})
export class App implements OnInit, OnDestroy {
  public name: string;
  public selectedValue: string = '';
  public values$: Observable<Array<string>> = new Observable(observer => this.observer = observer);
  protected observer: Subscriber<Array<string>>;
  protected subscription: Subscription;

  constructor() {
    this.name = `Angular! v${VERSION.full}`
  }

  ngOnInit() {
    this.subscription = this.values$.subscribe((values) => {
      console.log('never fired...');
      this.selectedValue …
Run Code Online (Sandbox Code Playgroud)

javascript rxjs typescript angular angular-forms

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

formGroup需要一个FormGroup实例:angular 4

我在角度4中创建了一个formGroup,其中用户和组织存储在对象中.现在我想使用这两个对象填充我的表单组.在我的ts中,我做了以下事情:

createForm(user: any) {
    this.userForm = this.fb.group({
      name: user.profileData.name,
      email: user.profileData.email,
      phone: user.profileData.mobileNumber,    
      orgForm: this.fb.group({
        name: [ user.organisation.name , [Validators.required]]
      })
    });
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我正在做这样的事情:

<form [formGroup]="userForm" class="user-form" (ngSubmit)="onSubmit()" novalidate>
      <div fxLayout="row">
        <div fxLayout="column" fxFlex="50%">
          <div class="form-group">
            <md-input-container class="full-width">
              <input mdInput placeholder="User Name" formControlName="name">
            </md-input-container>
          </div>
          <div class="form-group">
            <md-input-container class="full-width">
              <input mdInput placeholder="User Email" formControlName="email">
            </md-input-container>
          </div>
          <div class="form-group">
            <md-input-container class="full-width">
              <input mdInput placeholder="User Phone" formControlName="phone">
            </md-input-container>
          </div>
          <div class="form-group">
            <button md-raised-button type="submit" [disabled]="userForm.pristine">Save</button>
          </div>
        </div>
        <div fxLayout="column" fxFlex="50%" formGroupName="orgForm">
          <div …
Run Code Online (Sandbox Code Playgroud)

angular angular-forms formgroups

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

FormArray没有FormControls,只是字符串Angular 2

我的后端有两个字符串数组,我必须用一个字符串或多个字符串填充.但它们不是关键值对.我试图将一个字符串推入其中一个数组,但遇到的事实是我没有,也无法指定一个控件:值对.

我的formArray看起来像

collections: new FormArray([]),
Run Code Online (Sandbox Code Playgroud)

我的html选择字符串

              <md-select placeholder="Collection">
            <md-option (click)="addCollectionId('one')" value="Local">Local</md-option>
            <md-option (click)="addCollectionId('two')" value="Music">Music</md-option>
            <md-option (click)="addCollectionId('three')" value="Performing Arts">Performing Arts</md-option>
            <md-option (click)="addCollectionId('four')" value="Sports">Sports</md-option>
            <md-option (click)="addCollectionId('five')" value="Restaurants">Restaurants</md-option>
          </md-select>
Run Code Online (Sandbox Code Playgroud)

我将字符串添加到formArray的逻辑如下:

  addCollectionId(id: string) {
const control = <FormArray>this.createCardForm.controls['collections'];
control.push(id);
Run Code Online (Sandbox Code Playgroud)

}

我收到错误'类型'字符串的参数'不能分配给'AbstractControl'类型的参数.

因为我无法推送一个控件:值对而只有字符串/字符串如何在保持整体形式的同时将字符串推送到数组?

任何帮助/提示/建议将不胜感激.

angular angular-forms

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

为什么我们将[formGroup]指令应用于方括号下的表单,而对于表单字段,我们应用不带方括号的formControlName指令?

我正在关注一个关于反应形式的Angular 4教程.在使用FormGroup和FormControl指令时,我发现不一致 -

<form [formGroup]="formObj">
<div class="form-group">
<input formControlName="username">
Run Code Online (Sandbox Code Playgroud)

它在方括号下应用[formGroup]指令而不使用方括号的formControlName指令.

我在这里错过了什么?

angularjs-directive angular angular-forms

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

为什么我需要在组件级别提供NG_VALUE_ACCESSOR?

看一下这个例子:

https://stackblitz.com/edit/angular-nxjeu3

这是行不通的。

但是,如果我将的providers@NgModule移到HelloComponent,它确实可以工作。为什么?提供的@NgModule级别或@Component级别不应该相同吗?

angular angular-forms

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

无法在字符串上创建属性"验证器"

我正在尝试创建一个Angular 5嵌套反应形式.

我开始创建一个平面形式,按预期工作,但只要我提取部分表单并将其作为子组件放置,我就会收到错误

错误TypeError:无法在字符串'addressFormGroup'上创建属性'validator'

如果我刚开始键入,则会在控制台中显示另一个错误

错误TypeError:this.form.get不是函数

我究竟做错了什么?我已经阅读了几个线程和教程来尝试解决这个问题,但我认为我错过了一些明显的东西.

import { Component, OnInit } from '@angular/core'
import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
import { Address } from '../Property';

@Component({
moduleId: module.id,
selector: 'app-property-form',
templateUrl: './property-form.component.html',
styleUrls: ['./property-form.component.css']
})
export class PropertyFormComponent implements OnInit {

propertyForm: FormGroup;

constructor(private _formBuilder: FormBuilder) {}

ngOnInit() {
    this.createForm();
}

createForm() {
    this.propertyForm = this._formBuilder.group({
        saleOrLet: ['Sales', Validators.required],
        addressFormGroup: this.initAddress()
    })
}

initAddress() {
    return this._formBuilder.group({
        houseNameNumber: '',
        address2: '',
        postCode1: '',
        postCode2: ''
    }) …
Run Code Online (Sandbox Code Playgroud)

angular angular-forms angular5

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

如何在Angle 4+中获取FormControl的完整路径

如何在Angle 4+中获取FormControl的完整路径?

我有反应形式:

{
    name: '',
    address: {
        city: '',
        country: ''
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我需要获得完整的控制权:

const addressFormGroup = this.form.get('address');
const cityControl = addressFormGroup.get('city');
cityControl.plsGiveMeFullPath() //address.city
Run Code Online (Sandbox Code Playgroud)

有没有现有的方法来获取cityControl的完整路径:FormGroup?

typescript angular angular-reactive-forms angular-forms

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

角度输入必需字段不起作用

我有一个用于创建新实体的表单,如下所示:

<form #createAppForm="ngForm"
        (ngSubmit)="createApplication(createAppForm.value)"
        autocomplete="false" novalidate>
    <div class="form-group"
         [ngClass]="{'error': createAppForm.controls.applicationName?.invalid && createAppForm.controls.applicationName?.touched}">
    <label for="applicationName">Application Name</label>
    <em *ngIf="createAppForm.controls.applicationName?.invalid && createAppForm.controls.applicationName?.touched">Required</em>
    <input name="applicationName" required id="applicationName" type="text"
           class="form-control" placeholder="Name of application..." />
    </div>
Run Code Online (Sandbox Code Playgroud)

我没有在输入中使用ngModel,因为表单出现时应该是空白的,并且我将createAppForm.value提交给ngSubmit.但是,每当我检查表单的有效属性时:

{{createAppForm.invalid}}
Run Code Online (Sandbox Code Playgroud)

总是返回false,即使我单击输入字段并单击,也没有填写任何内容.作为必填字段,它是否应该返回true?

我使用了类似的形式,编辑数据,在那里我使用[ngModel]并且工作正常,验证了必需的字段.这里是否需要[ngModel],如果是这样,为什么呢?因为我正在传递表格的价值.

angular angular-forms

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

如何在不提交Angular表单的情况下添加按钮?

在Angular中,如何添加按钮而不提交表单?

例如,我想在onCancel不提交表单的情况下打电话,但是更新按钮应提交表单,并且仍然保留ngSubmit

<form [formGroup]="form" (ngSubmit)="submit()">
    <p>
    <select ...>...</select>
    </p>
    <p>
    <button
        type="submit"
        mat-raised-button
        color="primary">
        update
    </button>
    <button mat-raised-button (click)="onCancel($event)">
        cancel
    </button>
    </p>
</form>
Run Code Online (Sandbox Code Playgroud)

angular angular-forms

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