Angular反应形式,不会在传入数据上生成复选框

亚历克斯

有一个带有过滤器的表格。我通过FormBuilder创建表单。静态数据没有问题,但是我无法处理传入的数据。我需要在航空公司中呈现一组复选框,类似于transferFilter。在pathValue的帮助下,我将该字段的值更改为已处理的数据,出现了10个元素。

{{filtersForm.value | json}}
,数据会显示和更改,而且不会出现复选框。我不想将表单拆分为单独的实体,但是如果找不到答案,则必须重做。

形成一组复选框的方法:

private mapToCheckboxArrayGroup (data: string [], display): FormArray {
    return this.fb.array (
      data.map ((val, i) => {
        return this.fb.group ({
          value: val,
          display: display [i],
          selected: false,
        });
      })
    );
  }

我创建一个组:

filtersForm: FormGroup = this.fb.group ({
    sort: [this.priceSortItems [0] .attribute],
    transferFilter: this.mapToCheckboxArrayGroup (
      this.availableTransferValue,
      this.availableTransferDisplay
    ),
    minCost: [null],
    maxCost: [null],
    airlines: [null],
  });

我接收数据,进行处理并使用以下方法组成一个小组:

private refresh $ = new Subject ();

carriers $ = this.refresh $ .pipe (
    startWith (true),
    switchMap (() => this.dataService.getCarriers ()),
    map ((e) => {
      const keys = [... Object.keys (e)];
      const values ​​= [... Object.values ​​(e)];
      const airItems = this.mapToCheckboxArrayGroup (keys, values);
      return airItems;
    }),
    shareReplay (1)
  );

我对以下形式的更改做出反应:

filterData $ = this.refresh $ .pipe (
    startWith (this.filtersForm.value),
    switchMap (() => this.filtersForm.valueChanges),
    map ((e) => {
      console.log (e);
      console.log (this.filtersForm.controls);
    }),
    shareReplay (1)
  );

我订阅了数据更新,并通过PathValue将航空公司组的值从方法更改为formarray:

ngOnInit (): void {

    this.carriers $ .pipe (takeUntil (this.destroy $)). subscribe ((e) => {
      this.filtersForm.patchValue ({
        airlines: e.value,
      });
    });
}

我通过getter将包含数据的数组发送到模板:

get carrierFilterArray () {
    const carriers = this.filtersForm.get ('airlines') as FormArray;
    console.log (carriers.value);
    return carriers;
  }

HTML表单:

<form * ngIf = "filtersForm.value" [formGroup] = "filtersForm" class = "page__menu menu-page">
    <div class = "menu-page__sort" * ngIf = 'priceSortItems'>
      <h3 class = "menu-title"> Sort </h3>
      <div class = "menu-page__sort items" * ngFor = "let elem of priceSortItems; let i = index">
        <input formControlName = "sort" [value] = "elem.attribute" type = "radio" [id] = "elem.value" /> <label
          [for] = "elem.value"> {{elem.display}} </label> <br />
      </div>

      <div class = "menu-page__filter" formArrayName = "transferFilter">
        <h3 class = "menu-title"> Filter </h3>
        <div class = "menu-page__filter items" * ngFor = "let elem of transferFilterArray.controls; let i = index"
          [formGroup] = "elem">
          <input type = "checkbox" [formControl] = "elem.get ('selected')" [value] = "elem.get ('value'). value"
            [id] = "elem.get ('value'). value" />
          <label [for] = "elem.get ('value'). value"> {{elem.get ('display'). value}} </label> <br />
        </div>
      </div>

      <div class = "menu-page__price">
        <h3 class = "menu-title"> Price </h3>
        <p>
          From
          <input formControlName = "minCost" type = "text" />
        </p>
        <p> Before <input formControlName = "maxCost" type = "text" /> </p>
      </div>

      <div class = "menu-page__airlines" formArrayName = "airlines">
        <h3 class = "menu-title"> Airlines </h3>
        <div class = "menu-page__filter items" * ngFor = "let elem of carrierFilterArray.controls; let i = index"
          [formGroup] = "elem">
          <input type = "checkbox" [formControl] = "elem.get ('selected')" [value] = "elem.get ('value'). value"
            [id] = "elem.get ('value'). value" />
          <label [for] = "elem.get ('value'). value"> {{elem.get ('display'). value}} </label> <br />
        </div>
      </div>
      <pre> {{filtersForm.value | json}} </pre>
    </div>
  </form>

结果,除最后一个过滤器外,我得到了所有普通过滤器。在下面您可以看到json form.value,其中包含所有数据

我了解需要异步执行的操作,但我不知道如何执行该项目。•该项目具有教育意义,起初我是用纯JS制作的,现在我想在Angular中完成它。我将不胜感激小费。

Msk Satheesh

您需要等待,直到传入的数据到达,然后使用所需的数据创建表单

然后放一个

 <div *ngIf="anyKey">
       **//Here you need to render your form** 
    </div> 

收到数据后,您需要生成表格。

    anyKey = false;
    filtersForm: FormGroup; 

   constructor(){
    this.refresh $ .pipe (
        startWith (true),
        switchMap (() => this.dataService.getCarriers ()),
        map ((e) => {
          const keys = [... Object.keys (e)];
          const values ​​= [... Object.values ​​(e)];
          const airItems = this.mapToCheckboxArrayGroup (keys, values);

          //Create your form here and make the key as true
          this.filtersForm = this.fb.group ({
              sort: [this.priceSortItems [0] .attribute],
              transferFilter: this.mapToCheckboxArrayGroup (
                 this.availableTransferValue,
                 this.availableTransferDisplay
              ),
              minCost: [null],
              maxCost: [null],
              airlines: airItems 
          });
          this.anyKey = true;

        }),
        shareReplay (1)
      );
}

我认为这将帮助您呈现所有控件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

复选框列表不会在复选框v模型的动态生成数组中更新

使用复选框更新Ajax DB不会在Laravel上更新

复选框不会在点击时使用

尽管在调试选项中设置了复选框,Visual Studio Debugger不会在NullReferenceException上中断

Ionic中的Angular 2反应形式复选框验证

Angular 8反应形式:不可单击复选框

Angular 5反应形式设置垫复选框

具有反应形式的 Angular 2 复选框值

应该不会在我的RecyclerView中更新复选框

复选框下拉列表不会在ASP MVC中停留

WordPress复选框永远不会在配置文件页面上更新

如果是由javascript设置的,则ng change事件不会在复选框上触发

复选框不会在重新渲染时自行重置

SharedPreferences不会在我的Android应用程序中保存该复选框

Acumatica复选框不会在字段值更改时更新

复选框不会在页面加载时触发功能

JavaScript - 我的复选框(默认选中)不会在页面加载时运行它的脚本

未选中的复选框不会在数组变量中提取

根据最初选中的复选框值,在后退按钮单击上重新加载Angular 6反应形式

jQuery-即使在单击列表时也会触发,但不会在其中嵌入的复选框上触发

当您单击它时,IE不会在不确定的复选框上触发“更改”事件

重构以响应钩子后,地图中的复选框不会在数组更新时更新

自定义复选框不会在基本jQuery类添加时切换

以角度反应形式在动态生成的复选框中显示所需的验证消息

NSToolBar上的复选框不会更新?

带有枚举和复选框的Angular 8反应形式

如何使用angular8在反应形式中使复选框值为真

Angular 9反应形式:使用trackBy时,复选框未更新

如何以Angular反应形式检查所有复选框