在Angular2中更新一个位于formArray中的formControl,它是一个文件输入。
在Angular2中更新一个位于formArray中的formControl,它是一个文件输入。
我有以下的代码:
import { Component, OnInit, ElementRef } from '@angular/core'; import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms' @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { showSort: boolean = false; form: FormGroup; name: FormControl; sortSelf: FormControl; sortItem: FormArray; locationItems: FormArray; constructor(private _fb: FormBuilder, private _elementRef: ElementRef ) { } ngOnInit(): void { this.sortItem = this._fb.array([this.initSort()]); this.form = this._fb.group({ sortItem: this.sortItem }); } initSort() { return this._fb.group({ locationPicture: new FormControl('', []), locationItems: this._fb.array([ this.initSortItems() ]) }) } initSortItems() { return this._fb.group({ itemPicture: new FormControl('', []) }) } addSort() { this.sortItem.push(this.initSort()); } addSortLocationItem(i?: number, t?: number) { const control: FormArray =this.sortItem.at(i).get('locationItems'); control.push(this.initSortItems()); } showImage(event, level?: string, i?: number, t?: number){ let file = event.target.files[0]; if(level === 'locationPicture'){ ( this.sortItem.at(i)).controls['locationPicture'].setValue(file, {onlySelf: true}); }else{ ( this.sortItem.at(i).get('locationItems')).at(t).get('itemPicture').setValue(file, {onlySelf: true}); } } next(value, valid: boolean){ console.log(`this is value ${JSON.stringify(value, null, 4)}`); } }
标记:
我试图通过更新表单控件的值来在showImage方法中更新表单。然而,我无法让表单根据图片进行更新。当我尝试在'locationPicture'和'itemPicture'上上传时,我会遇到以下错误:
Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.
请帮助我解决这个问题,谢谢。
问题的出现原因是在Angular2中,当需要更新一个包含文件输入的formControl时,会遇到困难。在这个例子中,用户想要上传一个包含字符串和图像的FormData对象到Django REST API。他创建了一个名为"upload-image-form"的组件,其中包含一个FormGroup来表示表单,并且有一个file input用于上传图像。然而,他遇到了一个问题,无法更新file input的值。
解决方法是将file input的值与其他字段分开处理。他在组件中添加了一个private变量file,并在onChange()方法中捕获了file input的值。然后,在提交表单时,他使用FormData对象将该文件追加到formData中。通过遍历imageForm中的其他字段,将这些字段也追加到formData中。最后,他将formData传递给imageService的post()方法来进行提交。
这个问题的解决方法可以在以下链接找到:https://stackoverflow.com/a/41465502/2803344
这篇文章解决了在Angular2中更新一个包含文件输入的formControl的问题,并提供了一个实际的代码示例来演示解决方法。如果你在使用Angular2时遇到了类似的问题,希望这篇文章能对你有所帮助。你可以在上面的链接中找到完整的项目代码。