我正在使用Angular2的FromBuilder构建一个查询以发送到我的后端(MongoDB)。问题是,我试图访问二级属性。例如,我有一个歌曲,里面有一个Genres数组。我想访问genres.hipHop,但我不能将表单组设置为genres.hipHop。我所能做的就是用一个字。
以下是我要构建的查询示例
{
"where": {
"and": [
{"genres.house": {"exists": "true"}}
]
},
"order": "created DESC"
};
My FormBilder看起来像这样:
this.queryForm = this._formBuilder.group({
where: this._formBuilder.group({
and: this._formBuilder.array([
this._formBuilder.group({
genres : this._formBuilder.group({ <-- need it be genres.hipHop
exists: true
})
})
]),
order: 'created DESC',
})
});
创造了:
{
"where": {
"and": [
{"genres": {"exists": "true"}}
]
},
"order": "created DESC"
};
我无法在流派之后添加.hipHop。
我尝试在流派中嵌套流派(hipHop)但是当我把它发送到我的后端时,它并不认识hipHop。这是构建的查询:
{ "where": {
"and": [
{ "genres":
{ "hipHop": { "exists": true } }
}
],
"order": "created DESC" }
}
这是我得到的错误:
"MongoError: unknown operator: $hipHop\n
以下是歌曲对象的示例:
{
"title": "Sweet Talk feat. Quinn XCII (Evan Gartner Remix)",
"artist": "Academy",
"audio": "https://api.soundcloud.com/tracks/270500010/stream?client_id=90d140308348273b897fab79f44a7c89",
"image": "https://i1.sndcdn.com/artworks-000168676452-qkxqul-t500x500.jpg",
"download": "http://stereoload.com/academy/quinn-xcii-x-academy-sweet-talk-evan-gartner-remix",
"url": "http://soundcloud.com/academy401/sweettalkremix",
"created": "2016-12-13T09:21:28.071Z",
"genres": {
"hipHop": 30,
"house": 30,
"pop": 40
},
"rank": 0
}
谢谢!
答案 0 :(得分:1)
我认为你不能在这里使用点符号,因为它不是一个有效的密钥。
在源代码中查看此行:
https://github.com/angular/angular/blob/2.4.1/modules/%40angular/forms/src/form_builder.ts#L75
看起来Angular会迭代密钥来构建控件。由于你无法将“x.y”作为javascript中的键,因此失败。
实施例
var x = {y.z = "a"} //--> Uncaught SyntaxError: Unexpected token .
我认为你必须在你的流派FormGroup中制作另一组键 - 例如,其中一个键可能是hiphop。如果你想添加更多类型,那么你可能会想要做什么:)
编辑:
示例 -
this.queryForm = this._formBuilder.group({
where: this._formBuilder.group({
and: this._formBuilder.array([
this._formBuilder.group({
genres : this._formBuilder.group({
hiphop : this._formBuilder.group({
exists: true
})
})
})
]),
order: 'created DESC',
})
});
答案 1 :(得分:0)
您是否尝试将对象键定义为字符串"genres.hipHop"
?
this.queryForm = this._formBuilder.group({
where: this._formBuilder.group({
and: this._formBuilder.array([
this._formBuilder.group({
"genres.hipHop" : this._formBuilder.group({
exists: true
})
})
]),
order: 'created DESC',
})
});