Не видел хороших решений, но я сделал обходной путь, опубликованный ниже на случай, если у кого-то еще есть эта проблема. Обратите внимание, что это обходной путь, а не правильное решение.
в этом случае я создал скрытую форму на странице и создал поддельное поле загрузки файла в форме, которое имитировало события поля загрузки скрытой формы.
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 формально, без разветвления и настройки непосредственно.