Невозможно обновить объект с помощью multipart/formdata - данные NgRx
Я пытаюсь обновить одну из своих сущностей, которая также имеет функцию загрузки файлов. Я могу отправить (добавить) FormData с помощью метода добавления, но не могу обновить. NgRx дает ошибку ниже:
Ошибка: первичный ключ не может быть нулевым / неопределенным.
Это вообще возможно? Или я что-то не так делаю. Взгляните на код ниже:
const ad = {
id: form.id,
accountId: this.accountId
}
const data = new FormData();
data.append('ad', JSON.stringify(ad));
// photos is an array of uploaded files
if(this.photos.length) {
this.photos.forEach(photo => {
data.append('offure_ad', photo, photo['name']);
});
}
// NgRx Data update mothod
this.adService.update(data);
Пожалуйста, направьте меня в правильном направлении. Спасибо
2 ответа
Попробуйте этот код ниже
const ad = {
id: form.id,
accountId: this.accountId
}
const data = new FormData();
data.append('ad', JSON.stringify(ad));
// photos is an array of uploaded files
if(this.photos.length) {
this.photos.forEach(photo => {
data.append('offure_ad', photo, photo['name']);
});
}
// send ad like below
this.adService.update(data,ad);
Вы должны создать класс DataService и использовать настраиваемую функцию обновления, подобную этой.
@Injectable()
export class PromotionDataService extends DefaultDataService<Promotion> {
httpClient: HttpClient;
constructor(httpClient: HttpClient, httpUrlGenerator: HttpUrlGenerator) {
super('Promotion', httpClient, httpUrlGenerator);
this.httpClient = httpClient;
}
updatePromotion(promotionId: string, formData: FormData): Observable<Promotion> {
formData.append('_method', 'PUT');
return this.httpClient.post(`${environment.apiUrl}/api/v1/manager/promotion/` + promotionId, formData)
.pipe(map((response: Promotion) => {
return response;
}));
}
}
Я использую почтовый запрос, потому что запрос размещения не работает с multipart/form-data. Затем зарегистрируйте службу данных следующим образом.
@NgModule({
providers: [
PromotionDataService
]
})
export class EntityStoreModule {
constructor(
entityDataService: EntityDataService,
promotionDataService: PromotionDataService,
) {
entityDataService.registerService('Promotion', promotionDataService);
}
}
@NgModule({
declarations: [
PromotionComponent,
],
exports: [
],
imports: [
EntityStoreModule
],
})
export class PromotionModule {}
в вашем компоненте сначала введите службу данных в конструкторе, затем вы можете использовать пользовательскую функцию обновления, подобную этой
onSubmit() {
if (this.promotionForm.invalid) {
return;
}
const newPromotion: Promotion = this.promotionForm.value;
const fileControl = this.f.banner;
let files: File[];
let file: File = null;
if(fileControl.value){
files = fileControl.value._files
}
if(files && files.length > 0) {
file = files[0];
}
const formData = new FormData();
if(file != null){
formData.append('banner', file, file.name);
}
formData.append('data', JSON.stringify(newPromotion));
this.service.updatePromotion(promotion.id, formData)
}