使用 AngularFire2 的 Angular2 中的嵌套 Observables 未在视图中呈现
Nested Observables in Angular2 using AngularFire2 not rendering in view
我正在构建一个使用 Firebase 和 AngularFire2(目前处于 alpha 阶段)的实验性 (Ionic 2) 应用程序。为此,我以 Aaron Saunders 的本教程为基础:
http://www.clearlyinnovative.com/integrating-firebase-with-angularfire2-into-angular2-ionic2-part-2
https://github.com/aaronksaunders/ionic2-angularfire-sample
下面是我的 home.ts 和我的 home.html。
this.projects = af.list('/items').map( (items) => {
return items.map( item => {
item.meta = af.object(`/item_meta/${item.$key}`)
return item
})
})
AngularFire2 嵌套 Observables returns 的方式在以下演示中得到了演示:https://youtu.be/ngnSOTSS8Q8?t=1h6m37s
这是我的观点:
<ion-card *ngFor="#item of items | async">
<ion-card-header>
{{item.name}}
</ion-card-header>
<ion-card-content>
{{item.description}}
<br>
{{item.meta.stockPrice | async}}
</ion-card-content>
</ion-card>
与我所遵循的演示文稿中的示例的主要区别在于,我将 'object' Observable 嵌套在 'list/array' Observable 中。相反,他们在列表中添加一个列表。这样做的结果是我试图在我的视图中直接呈现 {{ item.meta.stockPrice }} 而不是嵌套 ngFor。
我的数据是这样的:
{
"items":
{
"item1":{
"name": "Item 1",
"description": "1234"
},
"item2":{
"name": "Item 2",
"description": "abcd"
}
}
"items_meta"{
"item1":{
"stockPrice": 1234,
"moarData": "derp"
},
"item2":{
"stockPrice": 386,
"moarData": "lolz"
}
}
}
我似乎无法弄清楚为什么对象不想呈现。如果我将它输出到 JSON 它表明数据在那里。请注意,我是 Angular2 的新手,并且仍在思考 Angular1 的变化。我做错了什么?
编辑:我更新了上面的信息并添加了我的数据结构以使其更加清晰
针对您的具体问题...
{{(item.meta | async)?.stockPrice}}
使用猫王运算符(?
)确保async
操作完成,然后访问所需的值
github 中的源代码:https://github.com/aaronksaunders/afwithngcli
--
你抢在我前面...正在处理新博客 post,但这是代码
script.html
</ion-card>
<ion-card *ngFor="#user of usersWithMessages | async">
<ion-card-header>
{{user.displayName}}
</ion-card-header>
<ion-card-content>
{{ (user.messages | async) | json}}
</ion-card-content>
</ion-card>
script.ts
this.usersWithMessages = this.af.list('/users').map((_users) => {
return _users.map((_user) => {
_user.messages = this.af.object("/userObjects/public-messages/" +_user.$key)
return _user
})
})
数据
"userObjects" : {
"public-messages" : {
"8d75a63e-80cd-40cc-8f8b-87d3d33b0cd0" : {
"message-id-0" : {
"text" : "a public message"
}
},
"9c6ea912-ec24-4127-b123-6512ed135f06" : {
"-KFCGp5ojo7JSX2myOPE" : {
"date" : "1460511658442.75",
"text" : "this should be a. public message"
},
"-KFCJc4GtEo_PDWi7hru" : {
"date" : "1460512391529.69",
"text" : "this is a message that should be public"
},
"message-id-100" : {
"date" : "3243245411111",
"text" : "public for the other user"
}
}
}
},
"users" : {
"8d75a63e-80cd-40cc-8f8b-87d3d33b0cd0" : {
"displayName" : "c@mail.com",
"provider" : "password"
},
"9c6ea912-ec24-4127-b123-6512ed135f06" : {
"displayName" : "b@mail.com",
"provider" : "password"
},
"cdcf32af-a8cd-467d-a04f-dfc223e890d2" : {
"avatar" : "https://secure.gravatar.com/avatar/d23563ab3014ce965a90c37b22a34da8?d=retro",
"displayName" : "bryce@mail.com",
"provider" : 4
}
}
我正在构建一个使用 Firebase 和 AngularFire2(目前处于 alpha 阶段)的实验性 (Ionic 2) 应用程序。为此,我以 Aaron Saunders 的本教程为基础:
http://www.clearlyinnovative.com/integrating-firebase-with-angularfire2-into-angular2-ionic2-part-2 https://github.com/aaronksaunders/ionic2-angularfire-sample
下面是我的 home.ts 和我的 home.html。
this.projects = af.list('/items').map( (items) => {
return items.map( item => {
item.meta = af.object(`/item_meta/${item.$key}`)
return item
})
})
AngularFire2 嵌套 Observables returns 的方式在以下演示中得到了演示:https://youtu.be/ngnSOTSS8Q8?t=1h6m37s
这是我的观点:
<ion-card *ngFor="#item of items | async">
<ion-card-header>
{{item.name}}
</ion-card-header>
<ion-card-content>
{{item.description}}
<br>
{{item.meta.stockPrice | async}}
</ion-card-content>
</ion-card>
与我所遵循的演示文稿中的示例的主要区别在于,我将 'object' Observable 嵌套在 'list/array' Observable 中。相反,他们在列表中添加一个列表。这样做的结果是我试图在我的视图中直接呈现 {{ item.meta.stockPrice }} 而不是嵌套 ngFor。
我的数据是这样的:
{
"items":
{
"item1":{
"name": "Item 1",
"description": "1234"
},
"item2":{
"name": "Item 2",
"description": "abcd"
}
}
"items_meta"{
"item1":{
"stockPrice": 1234,
"moarData": "derp"
},
"item2":{
"stockPrice": 386,
"moarData": "lolz"
}
}
}
我似乎无法弄清楚为什么对象不想呈现。如果我将它输出到 JSON 它表明数据在那里。请注意,我是 Angular2 的新手,并且仍在思考 Angular1 的变化。我做错了什么?
编辑:我更新了上面的信息并添加了我的数据结构以使其更加清晰
针对您的具体问题...
{{(item.meta | async)?.stockPrice}}
使用猫王运算符(?
)确保async
操作完成,然后访问所需的值
github 中的源代码:https://github.com/aaronksaunders/afwithngcli
--
你抢在我前面...正在处理新博客 post,但这是代码
script.html
</ion-card>
<ion-card *ngFor="#user of usersWithMessages | async">
<ion-card-header>
{{user.displayName}}
</ion-card-header>
<ion-card-content>
{{ (user.messages | async) | json}}
</ion-card-content>
</ion-card>
script.ts
this.usersWithMessages = this.af.list('/users').map((_users) => {
return _users.map((_user) => {
_user.messages = this.af.object("/userObjects/public-messages/" +_user.$key)
return _user
})
})
数据
"userObjects" : {
"public-messages" : {
"8d75a63e-80cd-40cc-8f8b-87d3d33b0cd0" : {
"message-id-0" : {
"text" : "a public message"
}
},
"9c6ea912-ec24-4127-b123-6512ed135f06" : {
"-KFCGp5ojo7JSX2myOPE" : {
"date" : "1460511658442.75",
"text" : "this should be a. public message"
},
"-KFCJc4GtEo_PDWi7hru" : {
"date" : "1460512391529.69",
"text" : "this is a message that should be public"
},
"message-id-100" : {
"date" : "3243245411111",
"text" : "public for the other user"
}
}
}
},
"users" : {
"8d75a63e-80cd-40cc-8f8b-87d3d33b0cd0" : {
"displayName" : "c@mail.com",
"provider" : "password"
},
"9c6ea912-ec24-4127-b123-6512ed135f06" : {
"displayName" : "b@mail.com",
"provider" : "password"
},
"cdcf32af-a8cd-467d-a04f-dfc223e890d2" : {
"avatar" : "https://secure.gravatar.com/avatar/d23563ab3014ce965a90c37b22a34da8?d=retro",
"displayName" : "bryce@mail.com",
"provider" : 4
}
}