Невозможно обновить объект с помощью 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)

  }
Другие вопросы по тегам