Данные не разделяются по id, последние пришедшие данные заменяют все

avatar
Bryan Ortiz
1 июля 2021 в 17:44
41
1
0

если бы кто-то мог мне помочь, у меня следующая проблема, я привожу список пользователей по идентификатору проекта, проблема в том, что когда я его привожу, он всегда выдает варианты последнего, но не тот вариант, в котором я am, все значения исходят от каждого варианта по идентификатору, но всегда тот, который приходит последним, будет давить другой вариант, если кто-то может мне помочь, пожалуйста

        <mat-form-field class="flex-auto">
            <mat-label>MIEMBROS</mat-label>
            <mat-select formControlName="userId" #labelSelect="matSelect" multiple>

                <mat-option (click)="createCustomer()" *ngFor="let user of customersUsuarios;" [value]="user.id">
                    {{ user.nombres }} {{ user.apellidos}}
                </mat-option>
            </mat-select>

        </mat-form-field>

        <mat-form-field class="sm:ml-6 flex-auto" style="display: none;">
            <mat-label>ID DEL PROYECTO</mat-label>
            <input formControlName="projectId" disabled readonly [(ngModel)]="defaults.id" matInput>
        </mat-form-field>
    </div>

ТС

        this.API.getProjects()
  .subscribe((data: CustomerProyecto[]) => {
    this.customersProyecto = data;
    data.forEach((element, i) => {
      this.API.getDataUsuariosNoRegistrados(element.id)

        .subscribe((data2: any) => {

          this.customersUsuarios = data2
          console.log("id del elemento ", element.id)

          console.log("datos de los usuarios ", data2)

        });
    });


  });

enter image description here

Источник

Ответы (1)

avatar
Momin Bin Shahid
1 июля 2021 в 22:34
1

Краткий ответ: переместите this.customersUsuarios перед вызовом API (если он не назначен заранее как массив), как здесь

this.customersUsuarios = []
this.API.getDataUsuariosNoRegistrados(element.id)
...

и вместо того, чтобы назначать data2 непосредственно this.customersUsuarios, поместите данные в массив (учитывая, что data2 поступает как массив)

// this.customersUsuarios = data2

// pushing data from `data2` inside array of `customersUsuarios`
// so, all the data can be collected instead of the last one only
this.customersUsuarios.push(...data2)

Подробности: мы назначаем данные, поступающие внутри data2, непосредственно в this.customersUsuarios, поэтому всякий раз, когда новые данные поступают через data2, они заменяют данные, уже присутствующие в массиве из предыдущих вызовов API

Итак, вместо того, чтобы назначать это вот так. Нам нужно накапливать все ответы, поступающие в data2, один за другим, начиная с пустого массива (считайте, что это контейнер) перед вызовом любого API, а затем комбинировать/объединять ответы, помещая новый data2 в этот массив для каждого элемент (объединение содержимого уже внутри контейнера с новым для каждого элемента)

Вы можете использовать любую технику слияния, примеры которой приведены ниже

// As mentioned previously, it adds the data directly into `this.customersUsuarios`
this.customersUsuarios.push(...data2)

/** 
 * OR 
 * 
 * concat two arrays (just like old days)
 * here we are assigning it because `concat` returns 
 * a new merged array and does not alter the array in question
 */
this.customersUsuarios = this.customersUsuarios.concat(data2)

// Another concat approach, same reason whichever you find easy to reason about
this.customersUsuarios = [].concat(this.customersUsuarios, data2);

Вот как this.customersUsuarios будет выдавать все ответы, поступающие внутрь data2 для каждого вызова API

Этот ответ основан на том, что я могу понять из этого (дайте мне знать, если я ошибаюсь, я попытаюсь решить и это)