我尝试使用React式方法验证表单。我使用文件输入从用户那里获取文件。我定义了一个自定义验证器,我得到了一个错误。验证程序没有接收整个事件,而是只接收文件的路径,比如C:\fakepath\abc.xlsx
。我想传递DOM事件,这样我就可以处理文件的所有属性,如类型、大小等。
下面是我的代码:
file.validator.ts
import { AbstractControl } from '@angular/forms';
export function ValidateFile(control: AbstractControl) :
{ [key: string]: boolean } | null {
const value = control.value;
if (!value) {
return null;
}
return value.length < 0 && value.files[0].type !== '.xlsx' && value.files[0].size > 5000000
? { invalidFile: true } : null;
}
sheet.component.ts
constructor(
private formBuilder: FormBuilder,
private alertService: AlertService
) {
this.sheetForm = this.formBuilder.group({
sheetType: ['Select Sheet Type', [Validators.required]],
sheetUpload: [null, [Validators.required, ValidateFile]],
sheetDescription: [
null,
[
Validators.required,
Validators.minLength(10),
Validators.maxLength(100),
],
],
});
}
sheet.component.html
<div class="input-group">
<label for="sheet-upload">Upload Sheet: </label>
<input
id="sheet-upload"
type="file"
(change)="handleFileInput($event)"
formControlName="sheetUpload"
accept=".xlsx"
/>
<small
id="custom-error-message"
*ngIf="
(sheetForm.get('sheetUpload').dirty ||
sheetForm.get('sheetUpload').touched) &&
sheetForm.get('sheetUpload').invalid
"
>
The file size exceeds 5 MB or isn't a valid excel type. Please
upload again.
</small>
</div>
任何帮助都将不胜感激。谢谢!
2条答案
按热度按时间s5a0g9ez1#
不确定这是不是最好的方法,但它很有效
file.validator.ts
sheet.component.html
jvlzgdj92#
您可以获取对input元素引用并在验证器中使用它