【问题标题】:Angular FormGroup and RxJsAngular FormGroup 和 RxJs
【发布时间】:2020-05-26 15:05:46
【问题描述】:

我想使用 FormGroups 重写我的一些表单,以便更轻松地批量验证输入等。我的问题是我一直在使用 RxJs 来收集值更改并开始根据新值,因为这些输入字段主要是数据表列过滤器。

到目前为止我所拥有的:

表单组:

private inputGroup = new FormGroup({
        fieldA: new FormControl(),
        fieldB: new FormControl(),
        fieldC1: new FormControl(),
        fieldC2: new FormControl(),
});

输入:

<input class="form-control" type="text" name="fieldA" formControlName="fieldA" />
<input class="form-control" type="text" name="fieldB" formControlName="fieldB" />
<input class="form-control" type="text" name="fieldC1" formControlName="fieldC1" />
<input class="form-control" type="text" name="fieldC2" formControlName="fieldC2" />

一个 Observable:

private search$ = new Subject<string[] | undefined>();

将所有参数收集到所需的 Observable 中的方法:

protected getCombinedParams(): Observable<GetParams> {
    return combineLatest([
        ...this.combineDefaultsBase,
        this.search$,
    ]).pipe(
        map(([PageIndex, PageSize, OrderColumns, searchValues]) => ({
            PageIndex, PageSize, OrderColumns,
            FieldA: searchValues['fieldA'],
            FieldB: searchValues['fieldA'],
            FieldC: [searchValues['fieldC1'], searchValues['fieldC2']]
        } as GetParams)));
}

this.combineDefaultsBase 位于基类中,包含用于排序、每页行数和页码的基本参数。

我有 inputGroup valuechanges 触发我的 observable:

 this.inputGroup.valueChanges.pipe(
        debounceTime(defaultInputDebounceTime)
    ).subscribe(newValue => {
        this.search$.next(newValue);
    });

GetParams 类:

export interface GetParams {
  FieldA?: string;
  FieldB?: string;
  FieldC?: string[];
}

我想要做的是将从 valuechanges 获得的 FormGroup 数组中的值映射到所需的 GetParams 值。 Ts 现在在FieldA: searchValues['fieldA'] 线上抱怨

(TS) 元素隐含地具有“任何”类型,因为类型的表达式 '"fieldA"' 不能用于索引类型 'number |细绳[]'。财产 'fieldA' 不存在于类型 'number |字符串[]'。

怎么说它是一个数字?它来自哪里?

【问题讨论】:

  • 我猜默认值的类型为any,也许在searchValues['fieldA']后面加上toString()
  • 你正在构造一个数组。所以使用map(([PageIndex, PageSize, OrderColumns, searchValues]:[number,number,number,any])=&gt;{...})。见stackoverflow.com/questions/31923739/… 注意:我真的更喜欢searchValues.fieldA 而不是searchValues['fieldA']

标签: angular typescript rxjs angular-reactive-forms


【解决方案1】:

在您的情况下,searchValues 的类型是 string[] | undefined(因为这是来自 search$ 的值,即 Subject&lt;string[] | undefined&gt;()

问题是你无法访问未定义数组的字段属性。

searchValues['fieldA'] 未定义,因为searchValues 的类型

【讨论】:

  • 我已将search$ 修改为私有Subject&lt;string[]&gt;,但仍无法通过searchValues[0], (&lt;string[]&gt;searchValues)[0], searchValues['fieldA']searchValues.fieldA 达到searchValues 的值。如果我尝试按名称寻址,否则会出现未定义的错误。但是,这些值按名称位于 searchValues 中。所以例如。 searchValue.fieldA 包含预期的内容。我应该声明一个具有 searchValues 属性的新类并使用它而不是简单的数组吗?
  • search$Subject&lt;string[]&gt; 所以 searchValuesstring[] = 一个字符串数组。通过执行searchValues.fieldA,您正在尝试访问字符串数组的属性fieldA,听起来那里有问题
猜你喜欢
  • 2021-10-10
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多