我在Ember.js中有关于从restful服务器检索数据的问题(使用MongoDB由Sails.js提供服务)
我的路由器设置如下:
App.Router.map(function() {
this.route("dashboard");
this.resource('exams', {path: "/exams"}, function() {
this.resource('exam', {path: ":exam_id"}, function(){
this.resource('questions', function() {
this.route("new");
})
})
this.route("view", {path: "/:exam_id" }); // for viewing exam details
});
});
基本上我得到一份可用的考试清单,并且可以编辑每个考试的一些细节,点击它查看相关的问题列表。
我对使用restful adapter访问的Exam资源没有任何问题,如下所示:
http://localhost:1337/api/v1/exams
产生:
{
exams: [
{
user_id: "52444c03268a31ea0b000001",
title: "Introduction test",
private: false,
active: false,
showResults: false,
random: false,
_id: "52471342445565e74600000a"
},
...
]
}
问题资源未嵌入并存储在MongoDB中是一个单独的集合,可以单独访问:
http://localhost:1337/api/v1/questions
结果:
{
questions: [
{
_id: "52483f404617e6c728c4ed93",
title: "What's the capital of Moscow?",
exam_id: "52471342445565e74600000a"
},
{
_id: "52483f6e4617e6c728c4ed94",
title: "What's the capital of Switzerland?",
exam_id: "52471342445565e74600120a"
}
]
}
但是,问题应始终与考试相关。据我所知,你还不能在Ember.js中嵌套休息路线。我理想的休息路线是:
http://localhost:1337/api/v1/exams/52471342445565e74600000a/questions
获取特定考试的所有问题,但我不确定是否可以这样做。至少我从不经理让它发挥作用。
所以为了保持简单,我决定用exam_id仔细查询问题,只得到与特定考试相关的问题列表:
http://localhost:1337/api/v1/questions/52471342445565e74600000a //<-- exam_id
返回我需要的结果......只有Ember.js不允许这样做,因为它认为我得到了一个特定ID的问题。我也尝试过将exam_id推向问题宁静的路线w / URL参数(../?exam_id=52471342445565e74600000a),但似乎queryParams还不是Ember.js的一部分。至少在v 1.2之前没有,正如我在Github上看到的那样。
所以我的问题是:如何通过证明外键来关联和查询这两个模型? 我真的不想把所有东西都嵌入到一件事中。或者也许有更好的方法来管理模型之间的关系?
但有一点需要注意:我需要能够正确地查询服务器以仅检索所需的记录,而不是对整个预取的数据进行排序。这是因为不同的考试属于不同的用户,对其他考试的问题不允许被其他人看到(查询)。
我对Ember.js不熟悉,所以任何建议(或更好的现实世界的例子)都会受到赞赏。
答案 0 :(得分:1)
如果使用Ember Data,大部分内容非常简单。
查询字符串部分很简单:
this.get('store').find('question', {exam_id: 123213});
会产生类似这样的GET'/ api / questions?exam_id = 123213'
关系部分非常棒且非常容易:
App.BlogPost = DS.Model.extend({
comments: DS.hasMany("comment")
});
App.Comment = DS.Model.extend({
post: DS.belongsTo("blogPost")
});