Как создать многомерный угловой 4 FormArray?

Я создаю динамическую форму с помощью инструмента ng-formly npm. Я хочу, чтобы эта форма была разделена на разделы и вкладки, но по-прежнему имела одну кнопку отправки. т.е. одиночный тег. Теперь я согласно документации этой библиотеки. Я создал этот интерфейс под названием TabType, который содержит поля различий для конкретной вкладки.

      export interface TabType {
            label: string;
           fields: FormlyFieldConfig[]
        }

Теперь, используя указанные ниже переменные и схему, я могу сгенерировать форму, которая разделена на разные разделы, используя указанный выше интерфейс TabType.

       form = new FormGroup({});
      model = {};
           options: FormlyFormOptions = {};


       tabs: TabType[] = [
{
  label: 'Personal data',
  fields: [

      {
        className: '',
        template: '<strong>Basic Information:</strong>',
      },

         {
            fieldGroupClassName: '',
            fieldGroup: [
              {
                className: 'mdc-text-field__input',
                type: 'input',
                key: 'firstName',
                templateOptions: {
                  label: 'First Name',
                },
               },

              {
                className: 'mdc-text-field__input',
                type: 'input',
                key: 'lastName',
                templateOptions: {
                  label: 'Last Name',
                },
                expressionProperties: {
                  'templateOptions.disabled': '!model.firstName',
                },
              },
            ],
        },


{
  className: '',
  template: '<strong>Address:</strong>',
},
{
  fieldGroupClassName: '',
  fieldGroup: [
    {
      className: 'row',
      type: 'input',
      key: 'street',
      templateOptions: {
        label: 'Street',
      },
    },
    {
      className: 'mdc-text-field__input',
      type: 'input',
      key: 'cityName',
      templateOptions: {
        label: 'City',
      },
    },
    {
      className: 'mdc-text-field__input',
      type: 'input',
      key: 'zip',
      templateOptions: {
        type: 'number',
        label: 'Zip',
        max: 99999,
        min: 0,
        pattern: '\\d{5}',
      },
    },
  ],
},


 {
  className: '',
  template: '<strong>Other Inputs:</strong>',
},
{
  type: 'textarea',
  key: 'otherInput',
  templateOptions: {
    label: 'Other Input',
  },
},
{
  type: 'checkbox',
  key: 'otherToo',
  templateOptions: {
    label: 'Other Checkbox',
  },
},


  ],
},


{
  label: 'Destination',
  fields: [
    {
      key: 'country',
      type: 'input',
      templateOptions: {
        label: 'Country',
        required: true,
      },
    },
  ],
},
{
  label: 'Day of the trip',
  fields: [
    {
      key: 'day',
      type: 'input',
      templateOptions: {
        type: 'date',
        label: 'Day of the trip',
        required: true,
      },
    },
  ],
},
 ];

Теперь, после создания этой переменной, я создаю One FormArray, называемый «формой», вот так:

      form = new FormArray(this.tabs.map(() => new FormGroup({})));

Наконец, в файле HTML у меня есть код ниже, который анализирует вкладку, а также TabType, называемый массивом вкладок, и получает доступ к нужным полям формы для его визуализации.

                     <div class="mdc-card">
                          <section class="mdc-card__primary view-section">
                              <h3>{{tab.label}}</h3>
                          </section>
                          <section class="mdc-card__supporting-text view-section-body">

                               <formly-form 
                                [form]="form.at(index)"
                                [model]="model"
                                [fields]="tab.fields"
                                [options]="options">
                              </formly-form>

                          </section>
                      </div>
                  </div>

Now I want to do one more iteration over the form elements and want to divide the fields in tabs. In above you can see it is creating sections.

Итак, я вижу проблему в том, что если мы можем создать многомерный массив FormArray, то мы можем итерировать его, используя списки вкладок, как мы это сделали, используя список разделов выше.

Может кто-нибудь подскажет, как это сделать?

Обновлять :

        form = new FormArray(this.tabs.map(() => new FormGroup({})));

               const baseForm: FormGroup = this.fb.group({
         tabs: this.fb.array([this.form,this.form,this.form])
          }) 

Теперь в приведенной выше baseForm есть данные всех трех вкладок (хотя и идентичны). Можете ли вы помочь передать его как массив, чтобы я мог перебирать его, потому что я не думаю, что могу перебирать объект formgroup в html.


person Talk is Cheap Show me Code    schedule 20.02.2018    source источник
comment
Я попытался создать другой интерфейс под названием ALLTABTYPES, но он не отображается с интерфейсом tabstype.   -  person Talk is Cheap Show me Code    schedule 20.02.2018


Ответы (1)


Вы должны разделить вашу форму на вкладки, скажем, ваша базовая форма будет выглядеть так:

// fb: FormBuilder     
const baseForm: FormGroup = this.fb.group({})

ваша основная цель - разделить вашу форму на вкладки, поэтому необходимо перебрать все ваши вкладки, поэтому вам нужен массив вкладок внутри вашей формы

const baseForm: FormGroup = this.fb.group({
    tabs: this.fb.array([])
})

этот массив форм должен иметь внутри все поле, принадлежащее вашей конкретной вкладке ... он будет содержать список групп форм

const baseForm: FormGroup = this.fb.group({
    tabs: this.fb.array([
       this.fb.group({
         f1: this.fb.control("value"),
         g2: this.fb.group({ 
           f2: this.fb.control("value")
         }),
         a3: this.form.array([])
       })
    ])
})

это решение использует ReactivesFormsModule

РЕДАКТИРОВАТЬ: HTML будет выглядеть как

<form class="ui form form-group" [formGroup]="baseForm">
  <div formArrayName="tabs">
    <div *ngFor="let tabGroup of tabs.controls; let i=index" [formGroupName]="i">
     <input type="text" formControlName="f1">
     <div [formGroup]="g2">
        <input type="text" formControlName="f2">
     </div>
      <div formArrayName="a3">
       .....// other form group
      </div>
   </div>
  </>
</form>
person Ricardo    schedule 20.02.2018
comment
Привет, Ричардо, спасибо за ответ. Вы хотите сказать, что вместо создания массива форм из групп форм, я должен создавать группы форм из массива форм, которые уже вложены? Также я должен использовать для этого formbuilder? - person Talk is Cheap Show me Code; 20.02.2018
comment
Итак, как мне получить доступ к этой вложенной структуре в html? так же, как я сделал ??? - person Talk is Cheap Show me Code; 20.02.2018
comment
да, мне очень нравится использовать реактивную форму, и формбилдер очень помог мне создать мою реактивную форму, я думаю, будет более понятной в обращении ... кое-что, что вам нужно иметь в наличии, - это когда вы собираетесь получать данные из формы значения будут разделены табуляцией - person Ricardo; 20.02.2018
comment
Ага, так что об этом можно позаботиться, добавив каждое значение вкладки в один общий массив или строку, а затем можно отправить как json. Я сомневаюсь только в том, примет ли используемый мной инструмент ng-formly модель формы или нет? Как мне разобрать это в html ?? - person Talk is Cheap Show me Code; 20.02.2018
comment
Я надеюсь, что добавленный мной пример html поможет вам понять - person Ricardo; 20.02.2018
comment
Привет, Ричардо, я полностью понимаю, как вы использовали группу форм для создания пользовательских элементов html с использованием этих групп форм. используя ваше предложение, я использовал formbuidler и получаю один элемент formgroup, содержащий все данные вкладок, которые я искал. Могу ли я проанализировать группу форм с помощью ngFor или создать массив форм с помощью конструктора форм? - person Talk is Cheap Show me Code; 20.02.2018
comment
кое-что, что я забыл упомянуть, это: хорошая практика - иметь метод get, который обрабатывает массив форм, что-то вроде get tabs (): FormArray {return this.baseForm.get (tabs) as FormArray}, который поможет вам справиться с tabs массив как есть, потому что по умолчанию метод get возвращает AbstracFormControl - person Ricardo; 20.02.2018
comment
Теперь в приведенной выше baseForm есть данные всех трех вкладок (хотя и идентичные) с использованием кода, который я редактировал в вопросе. Можете ли вы помочь передать его как массив, чтобы я мог выполнять итерацию по нему, потому что я не думаю, что могу повторять объект formgroup в HTML. Возможно, вы используете только что предложенные вами методы вроде get_tabs (). - person Talk is Cheap Show me Code; 20.02.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Ricardo; 20.02.2018
comment
хорошо, просто используйте то, что вы предлагаете get_tabs (); Я могу получить результаты в виде массива. Позвольте мне закончить html-часть, иначе мы обязательно обсудим в чате. Его решают. - person Talk is Cheap Show me Code; 20.02.2018
comment
Мне нужно поговорить с тобой в чате. Как-то мои настройки не работают .... Так что пообщаюсь, если возможно. - person Talk is Cheap Show me Code; 21.02.2018