IE: добавление полизаполнения FormData к angular с помощью formly - PullRequest
0 голосов
/ 23 января 2020

Я использую https://www.npmjs.com/package/formdata-polyfill и nxg в проекте angular, моя форма имеет поле загрузки файла, настроенное в форме. Теперь мы должны поддерживать IE, и для того, чтобы это работало, требуется полифилл, но я не знаю, как его добавить. Ошибка в том, что FormData.get не поддерживается в IE и нуждается в полизаполнении.

polyfills.ts

...
import 'formdata-polyfill';

form.component.ts

...
this.fields = [
    {
      key: 'file',
      id: 'field_import_file',
      type: 'file-upload',
      templateOptions: {
        required: true,
        fieldName: 'Import File',
        floatLabel: 'always',
        appearance: 'outline'
      },
      validation: {
        validators: ['file-upload']
      }
    }
  ];

Ответы [ 2 ]

1 голос
/ 23 января 2020

formdata-polyfill должен быть импортирован polyfills.ts файл, чтобы быть загруженным перед приложением.

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

...
import 'formdata-polyfill';

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

export class AppComponent {
  ...

  onSubmit(model) {
   const formData: FormData = new FormData();
   formData.append('file', model.file);
   formData.append('firstname', model.firstname);
   ...

   // send
   this.http.post(url, formData) ...
  }
}
0 голосов
/ 28 января 2020

Не видел хороших решений, но я сделал обходной путь, опубликованный ниже на случай, если у кого-то еще есть эта проблема. Обратите внимание, что это обходной путь, а не правильное решение.

в этом случае я создал скрытую форму на странице и создал поддельное поле загрузки файла в форме, которое имитировало события поля загрузки скрытой формы.

fake-upload.component.ts

import { Component } from '@angular/core';
import { FieldType } from '@ngx-formly/material';
import { CustomTemplateOptions } from '../../../../../../kup-core/src/lib/models';

@Component({
  selector: 'app-fake-upload-field',
  template: `
    <div>
      <button
        (click)="onClick()"
        [id]="id"
        type="file"
        [formControl]="formControl"
        [formlyAttributes]="field"
        (change)="onChange()"
        ngDefaultControl
        [name]="id"
        mat-stroked-button
      >
        Choose File
      </button>
      <input
        type="text"
        [value]="to.data.filename"
        class="fake-file-upload-input"
        (change)="onChange()"
      />
    </div>
  `,
  styles: [
    `
      .fake-file-upload-input {
        padding: 0;
        margin: 0;
        border: none;
      }
    `
  ]
})
export class FakeUploadComponent extends FieldType {
  to: CustomTemplateOptions;

  onClick() {
    document.getElementById('realFileUpload').click();
  }

  onChange() {}
}

, затем вручную добавили значения файлов обратно в модель формы,

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

  onHiddenFileUploadChange($event) {
    const el: any = document.querySelector('.fake-file-upload-input');

    this.stagedFile = $event.target.files;
    this.stagedFilename = $event.target.files[0].name;

    el.value = this.stagedFilename;
    this.checkForm();
  }

  triggerSave() {
    const form: HTMLElement = document.getElementById('importForm');
    const button: HTMLElement = form.querySelector('button[type=submit]');
    button.click();
  }

 private onImportTypeChanged(value: FormlyFieldConfig[]): void {
    this.viewModel.importTypes.map(type => {
      if (type.name === value[0].formControl.value) {
        value[1].formControl.patchValue(type.description);
        this.stagedType = type.name;
      } else if (!value[0].formControl.value) {
        this.stagedType = '';
      }
    });
  }

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

...