Javascript 如何干净地提取Parse.Object关系';在获取对象时,是否记录?
在《解析JavaScript指南》中,关于它的主题指出 默认情况下,在获取对象时,相关的Parse.Objects不是 取来。这些对象的值只有在 我被带走了 它们还指出,当Javascript 如何干净地提取Parse.Object关系';在获取对象时,是否记录?,javascript,parse-platform,Javascript,Parse Platform,在《解析JavaScript指南》中,关于它的主题指出 默认情况下,在获取对象时,相关的Parse.Objects不是 取来。这些对象的值只有在 我被带走了 它们还指出,当Parse.Object上存在关系字段时,必须使用该关系的query().find()方法。文档中提供的示例: var user = Parse.User.current(); var relation = user.relation("likes"); relation.query().find({ success: f
Parse.Object
上存在关系
字段时,必须使用该关系的query().find()
方法。文档中提供的示例:
var user = Parse.User.current();
var relation = user.relation("likes");
relation.query().find({
success: function(list) {
// list contains the posts that the current user likes.
}
});
我理解这在SDK设计方面是一件好事,因为它可以防止不必要地获取数百条相关记录。只获取您目前需要的数据
但是,在我的例子中,我知道永远不会有超过10条相关记录被提取的时候。我希望每次都能获取这些记录,因为它们将在视图中呈现
通过扩展
Parse.Object
,Parse.Object
与Parse结合使用时,是否有一种更简洁的方法来封装此功能。Promise
是关键
当扩展Parse.Object
以始终检索关系的对象时,我们可能会重写fetch
方法
例如,让我们考虑下面的例子,在这里我们要检索一篇文章及其评论(假设这是发生在一个想要显示文章及其评论的视图中):
如果每次我们想得到一篇帖子和它的评论时都要这样做,那会变得非常重复和令人厌烦。而且,我们不会枯燥,每次复制和粘贴15行代码 因此,让我们通过扩展Parse.Object
并重写其fetch
函数来封装它,如下所示:
/*
models/post.js
*/
window.myApp = window.myApp || {};
window.myApp.Post = Parse.Object.extend("Post", {
fetch: function(options) {
var _arguments = arguments;
this.commentsQuery = this.relation("comments").query();
return this.commentsQuery.find({
success: (function(_this) {
return function(comments) {
return _this.comments = comments;
};
})(this)
}).always((function(_this) {
return function() {
return _this.constructor.__super__.fetch.apply(_this, _arguments);
};
})(this));
}
});
免责声明:为了全面了解上述内容的工作原理,您必须真正了解如何和如何工作,但以下是在现有的帖子上调用fetch时,在描述性级别上会发生的情况:
尝试检索帖子的评论,并将其设置为帖子的评论
属性
无论上述操作的结果如何(无论是否失败),始终执行post的默认获取操作,并调用该操作的所有回调
您是否尝试过使用include(“likes”)
我对JavaScript API的熟悉程度不如ObjC API。。因此,在下面的示例中,我不确定“objectId”是否是您需要使用的实际键名
var user = Parse.User.current();
var query = new Parse.Query(Parse.User);
query.equalTo(objectId, user.objectId);
query.include("likes")
query.find({
success: function(user) {
// Do stuff
}
});
总的来说,你要考虑改变你的关系。我不确定向用户对象添加自定义值是否是个好主意。考虑创建一个类似的类型,让它指向用户
解析文档中的示例:
var query=newparse.query(注释);
//检索最新的
query.descending(“createdAt”);
//只取最后十个
查询.限额(10);
//在每条评论中包含帖子数据
查询。包括(“后”);
查询.查找({
成功:功能(评论){
//注释现在包含最后十条注释和“post”字段
//已填充。例如:
对于(var i=0;i
哦,太好了。然而,同样有很多代码需要重复。您认为有可能修改我的解决方案以优雅地使用include
?完全欢迎您的建议:)为什么您认为在您的案例用户和my case Post对象中添加自定义值是个坏主意?因为我们最终可能会对这些应用程序调用save
,这可能会对内部SDK造成严重破坏,和/或产生不正确解析数据的意外后果?感谢您的枯燥建议,每个程序员都应该为此着迷。
var user = Parse.User.current();
var query = new Parse.Query(Parse.User);
query.equalTo(objectId, user.objectId);
query.include("likes")
query.find({
success: function(user) {
// Do stuff
}
});
var query = new Parse.Query(Comment);
// Retrieve the most recent ones
query.descending("createdAt");
// Only retrieve the last ten
query.limit(10);
// Include the post data with each comment
query.include("post");
query.find({
success: function(comments) {
// Comments now contains the last ten comments, and the "post" field
// has been populated. For example:
for (var i = 0; i < comments.length; i++) {
// This does not require a network access.
var post = comments[i].get("post");
}
}
});