html - Angular 9 - 具有相同名称的 formControlName 的不同 formGroupName 影响相同的 formControlName

标签 html angular typescript angular-reactive-forms

我创建了 form: FormGroup 变量,我在服务的构造函数中使用 FormArray localizationData: FormArray 定义了组:

this.form = this.formBuilder.group({
    localizationData: this.formBuilder.array([])
});

然后我将具有特定 FormControl 的 FormGroup 推送到该 FormArray,并具有此功能:

addLocalizedFormGroup(locale?: any){
    locale = (locale == undefined) ? this.selectedLocale : locale;
    let formArray = <FormArray>this.form.get('localizationData');
    formArray.push(this.formBuilder.group({       
        locale: [locale.code],
        codelistName: ['', Validators.required]
    }));
    locale.created = true;
    this.createdLocales.push(locale);
}

在组件的 ngOnInit 中,我调用了该函数两次。语言环境对象变量示例:

{ "code": "SK", "name": "Slovenčina" }

要向用户显示我使用此功能的语言环境的特定格式:

localeFormatter = (x: any) => x.code + " | " + x.name;

我实现了带有本地化的简单选项列表,供用户选择一个:

<div class="form-group col-3">
    <label>Lokalizácia
        <select class="form-control" [(ngModel)]="this.defservice.selectedLocale">
            <option *ngFor="let locale of this.defservice.createdLocales" [ngValue]="locale">{{this.defservice.localeFormatter(locale)}}</option>
        </select>
    </label>
</div>

该选项列表工作正常。当我选择不同的语言时,模型作为对象发生变化。为了按语言环境查找 FormGroup,我为此创建了非常简单的函数:

localizationIndexOf(locale: any): number{
    return (<FormArray>this.form.get('localizationData')).controls.findIndex(x => x.get('locale').value == locale.code);
}

现在,我要挑战的问题是显示 FormControl 的用户值,codelistName,正如您在函数 addLocalizedFormGroup 中看到的那样。这是 html:

<ng-container [formGroup]="defservice.form">
    <ng-container formArrayName="localizationData">
        <ng-container [formGroupName]="defservice.localizationIndexOf(defservice.selectedLocale)">
            <div class="row">
                <div class="form-group col-2">
                    <label>Lokalizácia
                        <input type="text" class="form-control" [value]="defservice.localeFormatter(defservice.selectedLocale)"
                                disabled="true">
                    </label>
                </div>
                <div class="form-group col-10">
                    <label>Názov <span style="color: red">*</span>
                        <input type="text" class="form-control" formControlName="codelistName">
                     </label>
                </div>
            </div>
        </ng-container>
    </ng-container>
</ng-container>

但是在选项列表中切换语言后,本地化值正确更改,localizationIndexOf(defservice.selectedLocale) 返回正确的索引但是在编辑使用函数 addLocalizedFormGroup 创建的 FormmArray 的任何索引的 codelistName 之后,我添加的内容只有第一个(索引为 0 ) 在改变。我打印了整个形式的值(value),它只显示了第一语言的变化值(value)。事件如果我有 2 种或 10 种语言。我的意思是 2 或 10 个将 FormGroups 插入表单的 localizationData FormArray:FormGroup。似乎在第一次加载组件时,formGroup 永远不会更新他的值,我引用了这一行:

<ng-container [formGroupName]="defservice.localizationIndexOf(defservice.selectedLocale)">

感谢您的任何建议。

最佳答案

我自己重新创建了问题,但无法找到 *ControlName='' 的解决方案句法。我找到了一个 [formControl]=''但你将不得不忘记 formGroupName层次结构。

如果你能保留当前FormGroup的索引的引用的 localizationData: FormArray ,您将能够从数组中获取控件:

<input class="..." type="text" [formControl]="localizationData.at(currentLocaleIndex).get('codelistName')">

localizationData是 FormArray 的 setter/getter :

get localizationData(): FormArray {
    return this.form.get('localizationData') as FormArray
  }

还有一个解决方案来保持currentLocaleIndex up to date 是在 <select> 发生变化时更新值像这样:

<select (change)="updateCurrentLocaleIndex()" class="form-control" [(ngModel)]="this.defservice.selectedLocale">
  <option *ngFor="let locale of this.defservice.createdLocales" [ngValue]="locale">{{this.defservice.localeFormatter(locale)}}</option>
</select>

在你的组件类中:

updateCurrentLocaleIndex() {
   this.currentLocaleIndex = this.localizationIndexOf(this.defservice.selectedLocale)
 }

关于html - Angular 9 - 具有相同名称的 formControlName 的不同 formGroupName 影响相同的 formControlName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63893251/

相关文章:

html - 如何允许在 iOS 上上传 PDF 文件?

html - 响应式 bootstrap 3 个按钮并排无换行符,仅在太小时显示符号

javascript - 插值将应用于所有 ngfor 元素的范围文本内容

html - 如何更改前一个元素的样式值

javascript - 将字符串文字解析为枚举数组

javascript - 修改并返回内联变量

html - 背景附件 : fixed 的替代品

angular - OpenLayers 6 与 Angular 9 中没有交互

javascript - Angular - innerHTML,转义小于/大于字符,但保持 <br/> 不变

php - 文件上传按钮在翻转卡上不起作用