Это состояние гонки: при первой загрузке шаблона this.exercise
по-прежнему undefined
.Затем, когда наблюдаемое разрешается и присваивается значение, запускается цикл обнаружения изменений , запускается *ngFor
, и вы видите значения.
Существует два типичных шаблона, которые необходимо исправить.this:
Используйте оператор elvis (вероятно, лучше всего в вашем случае, потому что у вас есть только один метод доступа):
<p *ngFor="let p of exercise?.progress">{{ p.bpm }}</p>
?.
означает «получить доступ к свойствусправа от этого оператора, если операнд слева определен ".Если написать это так, очевидно, что они могут быть связаны: exercise?.progress?.timer?.started
Или использовать защитный элемент для элемента контейнера, что лучше, когда у вас много средств доступа и вы не хотите повторять ?.
везде:
<ng-container *ngIf="exercise">
<p *ngFor="let p of exercise.progress">{{ p.bpm }}</p>
<ng-container>
В приведенном выше примере я использовал <ng-container />
, потому что он не отображается в DOM, но вы можете также легко использовать его на реальном элементе, таком как <div />
.Это обычно используется в шаблоне *ngIf="exercise; else no-data"
, где #no-data
- это другой ng-шаблон, который заменяет div при загрузке ваших данных.
Примечание к сведению, поскольку Angular использует полифилы,вы можете безопасно использовать шаблонные строки в вашем TypeScript.Это означает, что вы можете написать
this.baseURL + 'exercises/GetProgressionByExerciseId/' + exId
как
`${this.baseURL}/exercises/GetProgressionByExerciseId/${exId}`
, что некоторым людям легче читать.