Я попытался сформулировать этот вопрос в связи с 3 примерами в этом plunk. Надеюсь, это поможет сделать вопрос более ясным.Угловая 2 - Объяснение для непоследовательного поведения при попытке доступа к свойствам объекта с использованием службы данных
У меня есть три массива данных:
localHeroes
определяется в app.component.tsdbHeroes
извлекается из базы данных (Firebase) и получает данные присваивается пустой массив в app.component.tsdbHeroesPredefined
извлекается из базы данных, а данные присваиваются предопределенному массиву в app.component.ts
(опять надеюсь, это понятно, что я имею в виду от шлепнуть, но и вставляя соответствующие выдержки ниже)
Все наборы данных могут быть отображены без проблем с использованием *ngFor
.
Доступ свойства:
{{localHeroes[0].name}}
отображает "Бэтмен", как и ожидалось.{{dbHeroes[0].name}}
ошибки с:"Cannot read property '0' of undefined"
. Ожидаемый результат для того, чтобы отобразить «Iceman» (имя первого героя вdbHeroes
массива, как показано ниже) *{{dbHeroesPredefined[0].name}}
дисплеиIronman
.
Вопросы:
Что мешает мне доступ к данным
dbHeroes
таким же образом, как иlocalHeroes
dbHeroesPredefined
?Почему пример
dbHeroes
ведет себя по-другому?Есть ли способ получить
{{dbHeroes[0].name}}
для отображения без предварительного определения массива, на который сопоставляются данные, как в примереdbHeroesPredefined
?
Полный пример можно найти на этом plunk. Внимательно оцените любую помощь в понимании этого.
Сноска: Исходя из этого post я думаю, с помощью дополнительных параметров ?
может быть способом решить эту проблему. Что-то вроде {{dbHeroes?[0].name}}
не помогло в этом случае, но так как объяснений вокруг этого ответа не было, поэтому я хотел бы быть более четким в вопросе и решении.
dbHeroes
массива в формате JSON:
dbHeroes: [
{
"name": "Iceman"
},
{
"name": "Fireman"
},
{
"name": "Postman"
},
{
"name": "Angry Clive"
}
]
dbHeroesPredefined
массива в формате JSON:
dbHeroesPredefined: [
{
"name": "Ironman"
},
{
"name": "Pacman"
},
{
"name": "Sonywalkman"
},
{
"name": "Intimidating Kenneth"
}
]
app.component:
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
moduleId: module.id,
selector: 'my-app',
templateUrl: 'app.component.html'
})
export class AppComponent implements OnInit {
dbHeroes?: any[];
localHeroes: any[] = [
{name: 'Batman'},
{name: 'Spiderman'},
{name: 'Dustinhoffman'},
{name: 'The Incredible Dave'}
];
dbHeroesPredefined: any[] = [
{name: 'placeholder'},
{name: 'placeholder'},
{name: 'placeholder'},
{name: 'placeholder'}
];
constructor(private dataService: DataService) { }
ngOnInit() {
this.dataService
.getEntryData('dbHeroes')
.subscribe(
(dbHeroes:any) =>
this.dbHeroes = (dbHeroes)
);
this.dataService
.getEntryData('dbHeroesPredefined')
.subscribe(
(dbHeroesPredefined:any) =>
this.dbHeroesPredefined = (dbHeroesPredefined)
);
}
}
Спасибо Гюнтера, что это очень полезно. Будет ли это всегда рекомендуемым обходным решением? Прошу, поскольку у меня была аналогичная проблема, пытающаяся перезагрузить форму (и значения формы), которые обращались к данным из firebase (я подозреваю, что та же проблема). Я думал, что это проблема с зависимостью, и мне может потребоваться написать обещание либо в dataService, либо в appComponent, который: 1) получит данные и назначит значения массиву THEN 2) разрешит привязки. Может ли этот вопрос когда-либо быть решен с обещанием или чем-то подобным? Я спрашиваю, как новичок так извиняется, если это глупое предложение. Спасибо за вашу помощь. – fivedoor
Обычно используется '? .', но это не поддерживается для' '' '' '' только для '.' (например,' dbHeroes? .someProp? .otherProp' –
получил это, что имеет смысл сейчас. – fivedoor