Angular 用户构建前端表单的最佳策略

Best strategy for Angular Front-End Form Building by Users

美好的一天,无论谁读到这篇文章,感谢您抽出宝贵的时间提供帮助!

以前,我经常使用 Wordpress (PHP),我们使用这个插件来收集元数据:高级自定义字段 (advancedcustomfields .com)。让它很酷的是,您可以通过 select 设置问题类型并配置它们的设置和样式(在内部或外部输入标签,或者, table 行和列指定每个键,答案将与这些键一起保存在数据库中)。

我希望在 Angular 8+ 中构建完全相同的东西,允许我的客户选择他们想要的任何类型的字段(输入)并将它们组合在一起。你建议我怎么做:

1) 构建自定义组件,例如:文本 input/area、收音机、table、地图、图像、文件上传、复选框、date/time 选择器、select 框,组等(每个都带有条件规则以显示或不显示取决于其他组件)......然后让用户为每个组件选择相关参数并使用@Input或服务将它们发送到组件ngOnInit()?

2) 是否已经存在类似的软件包可以让我更快地利用此类功能?

感谢您的建议和意见:)

Rgds, wzz

看看ngx-formly. Another option is ng-dynamic-forms。这些库具有可动态配置的输入元素部分。

来自下面演示的 ngx-formly 代码示例:

app.component.ts

import { Component } from '@angular/core';
import {FormGroup} from '@angular/forms';
import {FormlyFieldConfig} from '@ngx-formly/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
})
export class AppComponent {
  form = new FormGroup({});
  model = {};
  fields: FormlyFieldConfig[] = [
    {
      key: 'input',
      type: 'input',
      templateOptions: {
        label: 'Input',
        placeholder: 'Input placeholder',
        required: true,
      }
    },
    {
      key: 'textarea',
      type: 'textarea',
      templateOptions: {
        label: 'Textarea',
        placeholder: 'Textarea placeholder',
        required: true,
      }
    },
    {
      key: 'checkbox',
      type: 'checkbox',
      templateOptions: {
        label: 'Checkbox',
      }
    },
    {
      key: 'select',
      type: 'select',
      templateOptions: {
        label: 'Select',
        placeholder: 'Select placeholder',
        required: true,
        options: [
          { label: 'Option 1', value: '1' },
          { label: 'Option 2', value: '2' },
          { label: 'Option 3', value: '3' },
        ]
      }
    },
    {
      key: 'radio',
      type: 'radio',
      templateOptions: {
        label: 'Radio',
        required: true,
        options: [
          { label: 'Option 1', value: '1' },
          { label: 'Option 2', value: '2' },
        ]
      }
    }
  ];

  onSubmit() {
    if (this.form.valid) {
      alert(JSON.stringify(this.model, null, 2));
    }
  }
}

app.component.html

 <div class="header">
    <img src="https://raw.githubusercontent.com/ngx-formly/ngx-formly/v5/logo.svg?sanitize=true" alt="" width="72" height="72">
    <h4 class="mat-h2">Angular Formly Material</h4>
  </div>

  <form [formGroup]="form" (ngSubmit)="onSubmit()">
    <formly-form
      [form]="form"
      [model]="model"
      [fields]="fields">
    </formly-form>

    <button type="submit" color="primary" mat-raised-button>
      Submit
    </button>

    <button type="reset" color="warn" mat-raised-button>
      Reset
    </button>
  </form>