【问题标题】:Angular reactive form - checkboxes - Initialize formArray with exisitng array角反应形式 - 复选框 - 用现有数组初始化 formArray
【发布时间】:2020-11-23 04:08:43
【问题描述】:

我有一个从服务器获取的 lkBoardTypeList 列表的动态数组。我想在初始化时推送该数组以形成数组,基本上我想根据数组中的板名或 id 显示复选框。我知道如何以反应形式推送一个空数组。但是如何使用现有数组进行初始化。实际上它是一个更新/编辑组件

export class BoardTypeList{
id number;
descr string;
}

组件:

lkBoardTypeList: LkBoardType[] = []; 
SelectedLkBoardTypeList: LkBoardType[] = []; 

this.boardDashboardForm = this.formBuilder.group({
                    id: new FormControl(this.boardObj.id, Validators.required),
                    location: new FormControl(this.boardObj.location),
                    boardType: new FormArray([])
                 });
this.addCheckBoxes();

..//..//

 addCheckBoxes(){
        this.lkBoardTypeList.forEach(() => this.boardTypeFormArray.push(new FormControl(false)));
    }

 get boardTypeFormArray(){ 
        return this.boardDashboardForm.controls.boardType as FormArray;
    }

loadSelected(event){
    
        this.boardService.getBoardTypeById(event.value).subscribe( posts =>{
            this.data = posts; 
            console.log('getBoardTypeById',this.data);
            },
            error => { 
            console.log('getBoardTypeById - error',error);
            this._errorService.handleError(error); 
            }, 
            () => {   
            this.SelectedLkBoardTypeList = this.data.boardTypes;
            for (let i = 0; i < this.lkBoardTypeList.length; i++) {
            ..///.. what code goes here
            }
            }); 
}

在 HTML 中

<div class="row">
                
                <div class="col-sm-2">                
                    <p-dropdown [options]="boardArray" formControlName="id"  (onChange)="loadSelected($event)" placeholder=" Select "></p-dropdown> 
                </div>
                
            </div>
    <div class="form-group" >
                        <div formArrayName="boardType" *ngFor="let c of boardTypeFormArray.controls; let i = index">
                            <input class="col-sm-1" type="checkbox" [formGroupName]="i"/>
                            <span class="col-sm-5" >{{lkBoardTypeList[i].descr}}</span>
                        </div>
                    </div>

现在,当我检查元素时,我看到 formArrayName="boardType" 和复选框元素如下:

<input class="col-sm-1 ng-untouched ng-pristine ng-valid" type="checkbox" ng-reflect-name="0">
<input class="col-sm-1 ng-untouched ng-pristine ng-valid" type="checkbox" ng-reflect-name="1">
<input class="col-sm-1 ng-untouched ng-pristine ng-valid" type="checkbox" ng-reflect-name="2">

我猜 ng-reflect-name="0" 只不过是 'i' 的值。什么试图从 lkBoardTypeList 中设置 id 为 10、20、30 的数组的值。

另外请告诉我如何设置复选框中选中的值。 SelectedLkBoardTypeList - 例如,整个列表具有值 (10,20,30)。 selectedList 只包含 10 个,必须检查。

【问题讨论】:

  • 这就是它的工作方式。最初加载页面时,应取消选中所有复选框。但我想要 ng-reflect-name="10", ng-reflect-name="20",ng-reflect-name="30" 映射来自 lkBoardTypeList 的 id。 Next 当页面中的下拉菜单发生变化时,我得到了 selectedLkBoardTypeList。现在我检查一下应该检查和取消检查的内容。

标签: javascript angular forms angular-reactive-forms angular2-forms


【解决方案1】:

首先,你应该使用[formControlName]="i"而不是[formGroupName]="i"

ng-reflect-${name} 属性被添加用于调试目的,并显示组件/指令在其类中声明的输入绑定。

FormControlName 指令声明

@Input('formControlName') name!: string|number|null;

所以,您是对的:ng-reflect-name="0" 描述了您在 formControlName 输入中传递的值。


如果您想用SelectedLkBoardTypeList 预填充FormArray,那么您只需检查SelectedLkBoardTypeList 中是否存在特定项目。假设您有:

SelectedLkBoardTypeList: LkBoardType[] = [
  {
    id: 10,
    descr: 'Type 1'
  }
];

那么你的addCheckBoxes 方法应该如下:

addCheckBoxes() {
  this.lkBoardTypeList.forEach((type) => {
    const selected = this.SelectedLkBoardTypeList.some(x => x.id === type.id);
    this.boardTypeFormArray.push(new FormControl(selected))
  });
}

最后,如果您想在后期执行期间获取选定的项目,您可以将 FormArray 中的选定值映射到您的原始数组:

save() {
  const model = this.boardDashboardForm.value;

  const selectedTypes = model.boardType.filter(Boolean).map((_, i) => this.lkBoardTypeList[i]);
  console.log(selectedTypes);
}

Ng-run Example

【讨论】:

  • 谢谢。一个问题?当页面最初加载时,所有复选框都应未选中,但 formCONtrolName 的值应为 10、20、30,这需要在 adCheckBoxes 方法中进行哪些更改? selectedLkBoardTypeList 仅在我更改 html 文件中的另一个下拉元素时才出现。我将 formGroupName 更改为 formControlName。
  • 如果它们都未选中,那么所有值都应该是 false
  • 我的 addcheckBoxes 最初会有 false addCheckBoxes(){ this.lkBoardTypeList.forEach(() => this.boardTypeFormArray.push(new FormControl(false)));所以 ng-reflect-name="0",我希望它保持 ng-reflect-name="10" 或 20, 30 未选中,当我更改下拉菜单时,我会看到应该选择哪个并选择代码就可以了。
  • 如果SelectedLkBoardTypeListLkBoardType 的数组,那么它应该是这样的this.boardTypeFormArray.patchValue(this.lkBoardTypeList.map(item =&gt; selectedLkBoardTypeList.some(type =&gt; type.id === item.id)))
  • 你可以在这里查看ng-run.com/edit/1k3nE4GNbl7Rizj6Vosa
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 2021-06-29
  • 2019-07-07
  • 2022-01-18
  • 2020-05-29
  • 1970-01-01
  • 2022-01-15
  • 2019-11-09
相关资源
最近更新 更多