У меня есть массив JSON с 4 элементами в angular 7, но он показывает 0, когда я спрашиваю его длину

У меня есть API, который отвечает на запрос объекта JSON. Все выглядит нормально, но когда я хочу получить доступ к элементам этого массива JSON, он показывает 0 элементов вместо истинного значения.

это моя просьба:

private request(type: 'getall'|'getonebyid'|'addnew'|'editbyid'|'deleteonebyid',
                  mp?: IMeasurementInterfaces,
                  id?: string): Observable<any> {
  let base;
  this.serverUri = 'http://localhost:3000'; // localhost

  if (type === 'getall') {
    base = this.http.get<MeasurementDetails[]>(`${this.serverUri}/mea/${type}`);
  }
  const request = base.pipe(
    map((data: any) => {
      return data;
    })
  );
  return request;
}

функция запроса вызова:

public getall(): Observable<MeasurementDetails[]> {
    return this.request('getall');
}

заполнение mpserv, объявленного в файле component.ts:

this.mpserv.getall().subscribe(
  x => {
    x.forEach(element => {
      this.mp.push(element);
    });
  },
  err => console.error('Observer got an error: ' + err),
  () => console.info('Observer got a complete notification')
);

когда я запрашиваю console.info(this.mpserv), он отвечает так: У меня есть массив JSON с 4 элементами в angular 7, но он показывает 0, когда я спрашиваю его длину

Я использовал this.mp в качестве источника данных таблицы данных:

<div class = "measurement-type-grid">
<div class = "measurement-type-list">
<table mat-table [dataSource] = "dataSource">

  <!-- Position Column -->
  <ng-container matColumnDef = "position">
    <th mat-header-cell *matHeaderCellDef> No. </th>
    <td mat-cell *matCellDef = "let element"> {{element.position}} </td>
  </ng-container>

  <!-- title Column -->
  <ng-container matColumnDef = "title">
    <th mat-header-cell *matHeaderCellDef> title </th>
    <td mat-cell *matCellDef = "let element"> {{element.title}} </td>
  </ng-container>

  <!-- description Column -->
  <ng-container matColumnDef = "description">
    <th mat-header-cell *matHeaderCellDef> description </th>
    <td mat-cell *matCellDef = "let element"> {{element.description}} </td>
  </ng-container>

  <!-- Symbol Column -->
  <ng-container matColumnDef = "symbol">
    <th mat-header-cell *matHeaderCellDef> Symbol </th>
    <td mat-cell *matCellDef = "let element"> {{element.symbol}} </td>
  </ng-container>

  <!-- Edit Column -->
  <ng-container matColumnDef = "edit">
    <th mat-header-cell *matHeaderCellDef> Edit </th>
    <td mat-cell *matCellDef = "let element">
      <button mat-icon-button color = "primary">
        <mat-icon aria-label = "Edit data">edit</mat-icon>
      </button>
    </td>
  </ng-container>

  <!-- Delete Column -->
  <ng-container matColumnDef = "delete">
    <th mat-header-cell *matHeaderCellDef> Delete </th>
    <td mat-cell *matCellDef = "let element">
      <button mat-icon-button color = "primary">
        <mat-icon aria-label = "Delete data">delete_forever</mat-icon>
      </button>
    </td>
  </ng-container>

  <!-- Add New Column -->
  <ng-container matColumnDef = "add new">
    <th mat-header-cell *matHeaderCellDef> Add New </th>
    <td mat-cell *matCellDef = "let element">
      <button mat-icon-button color = "primary">
        <mat-icon aria-label = "Delete data">add_circle</mat-icon>
      </button>
    </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
  <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
</table>

<mat-paginator [pageSizeOptions] = "[5, 10, 20]" showFirstLastButtons></mat-paginator>
</div>
</div>

Я использовал эту функцию для заполнения данных в источник данных:

filltoelements(mdata: MeasurementDetails[]) {
// console.info(mdata);
if (!mdata) {
  console.info('data is undefined!!!!');
} else {
  let i: number;
  i = -1;
  mdata.forEach(element => {
    i++;
    this.ELEMENT_DATA[i].position = i + 1;
    this.ELEMENT_DATA[i].title = element.measureTitle;
    this.ELEMENT_DATA[i].description = element.measureDescription;
    this.ELEMENT_DATA[i].symbol = element.measureSymbol;
    this.ELEMENT_DATA[i].edit = 'edit';
    this.ELEMENT_DATA[i].delete = 'delete';
    this.ELEMENT_DATA[i].addNew = 'addNew';
  });
}
}

и я определил его в component.ts:

displayedColumns: string[] = ['position', 'title', 'description', 'symbol', 'edit', 'delete', 'add new'];
dataSource = new MatTableDataSource<MeasureTypeElemetns>(this.ELEMENT_DATA);

и вернул 0 как длину массива, а моя таблица данных пуста:

У меня есть массив JSON с 4 элементами в angular 7, но он показывает 0, когда я спрашиваю его длину

у тебя есть идеи?

Если вы получаете массив, почему вы перебираете его и нажимаете на другой массив? (Не ответ, но почему?)

Austin T French 07.06.2019 22:36

Возможно, когда вы вызываете console.info, вызов не возвращается с информацией, а длина нового массива по-прежнему равна 0. Поскольку это асинхронный вызов, вам нужно обязательно записать длину после HTTP звонок возвращается.

pjlamb12 07.06.2019 22:39

Итак, где вы пытаетесь получить доступ к массиву? вы должны делать это в методе .subscribe()

Ajay Reddy 07.06.2019 22:40

console.info() показывает вам обновленное значение (не в то время, когда вы его вызываете). Чтобы действительно проверить это, сделайте console.info(JSON.stringify(this.mp)). Вероятно, вы увидите пустой массив из-за асинхронного вызова.

Gilsdav 07.06.2019 22:44

@AustinTFrench Я хочу использовать массив mp в качестве источника данных для материала таблицы данных.

Ali Mohammadi 07.06.2019 23:00

@AjayReddy Я использовал его в качестве источника данных для материала таблицы данных, и он вернул пустую таблицу.

Ali Mohammadi 07.06.2019 23:02

Покажите код HTML, где вы его используете

Ajay Reddy 07.06.2019 23:16

@AjayReddy Я только что добавил дополнительную информацию. Пожалуйста, проверьте.

Ali Mohammadi 07.06.2019 23:33

@ Гилсдав Да! вот так. оно пустое. так в чем проблема?

Ali Mohammadi 08.06.2019 07:05

@ pjlamb12 Да, это правда. как мне убедиться, что HTTP-вызов возвращается?

Ali Mohammadi 08.06.2019 07:14
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
10
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо pjlamb12, Gilsdav и AjayReddy.

Я должен сделать это в методе подписки. поэтому мой код должен быть примерно таким:

  this.mpserv.getall().subscribe(
    x => {
      x.forEach(element => {
        this.mp.push(element);
      });
      this.filltoelements(this.mp);
    },
    err => console.error('Observer got an error: ' + err),
    () => console.info('Observer got a complete notification')
  );

тогда он работал правильно.

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