【问题标题】:Angular 2 | nested arrays in reactive form with dynamically built components角 2 |具有动态构建组件的反应形式的嵌套数组
【发布时间】:2018-04-12 23:03:02
【问题描述】:

我想在 Angular 2 中构建一个反应式表单并动态构建表单组件。我找到了一些很棒的教程,介绍了如何使用简单的表单来做到这一点:

https://toddmotto.com/angular-dynamic-components-forms

https://juristr.com/blog/2017/10/demystify-dynamic-angular-forms/

但是当数据模型包含字符串或对象数组时,我似乎无法弄清楚如何实现这一点。例如,考虑以下结构的对象:

{
  'name': 'Big Name Hotel',
  'tags': [
    'clean',
    'cozy',
    'cheap'
  ],
  'locations': [
    {
      'city': 'Denver',
      'state': 'CO',
    },
    {
      'city': 'San Francisco',
      'state': 'CA',
    },
    {
      'city': 'Los Angeles',
      'state': 'CA',
    }
  ]
}

我可以使用上面的教程之一为 name 元素构建一个动态表单组件,但是如何使它与字符串数组(标签)和对象数组(位置)一起工作?

=== 编辑更多内容 ===

这是其中一个教程的配置数据结构:

  config = [
    {
      type: 'input',
      label: 'Full name',
      name: 'name',
      placeholder: 'Enter your name',
    },
    {
      type: 'select',
      label: 'Favourite food',
      name: 'food',
      options: ['Pizza', 'Hot Dogs', 'Knakworstje', 'Coffee'],
      placeholder: 'Select an option',
    },
    {
      label: 'Submit',
      name: 'submit',
      type: 'button',
    },
  ];

字符串数组或对象数组的数据结构是什么样的?

【问题讨论】:

  • 到目前为止你有什么发现,你能告诉我们吗?
  • 老实说,没有超出我发布的教程。我不知道如何配置表单的数据结构以合并数组或如何为这些数组构建 html。但是一旦我弄清楚数据结构,我想我可以管理 html。我将更新帖子以包含其中一个教程中的数据结构示例。

标签: javascript angular forms dynamic


【解决方案1】:

我认为(现在无法测试)您可以将数组映射到 FormArray

const form = new FormGroup({
   tags : new FormArray(tags.map(tag => new FormControl(tag)))
});

【讨论】:

  • 是的,我可以看到这将如何为给定表单和特定数组设置一个数组,但我正在尝试将组件设置为动态生成表单和html。我不想为给定的数组编写自定义代码。
  • @JackVaughan 那么为什么不使用模板驱动的表单(而不是响应式)并让 html 生成代码。?
  • 是的,我知道我可以使用模板驱动的表单(甚至反应式)来构建它,但我特别希望我的组件能够动态生成——这是我想要完成的关键部分。我不想编写任何特定于一种表单的 html。
【解决方案2】:

使用 FormBuilder

constructor(
    private fb: FormBuilder
  ) { }


  createForm() {
    ...

   this.form= this.fb.group({
         name: [this.data.name],
         ...
        locations: this.fb.array([])
   });

    const locationsFGs = this.data.locations.map(loc=> {
      return this.fb.group({
        city: [loc.city, Validators.required],
        state: [loc.state],
      });
    });
    const locationsFormArray: FormArray = this.fb.array(locationsFGs );
    this.form.setControl('locations', locationsFormArray);
  }

【讨论】:

  • 感谢@Yerkon 的回复 - 但是这将如何动态构建组件的 html 部分?
  • @JackVaughan,例如你可以看这里stackblitz.com/edit/angular-form-array-deep-phnik3
  • 这看起来很有趣 - 让我看看我是否可以以此作为我想要完成的工作的起点。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 2017-08-04
  • 2018-07-27
  • 2019-06-04
  • 1970-01-01
  • 2018-01-21
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多