概述(简化)
我正在运行一个Meteor服务器,其发布是由ID参数化的:
Meteor.publish('documents.byId', function(documentId) {
...
return Documents.find({documentId});
});Documents集合(名称已更改)有一个SimpleScema附加到它。此文档的架构包含一个字段,该字段是一个子文档数组。
Documents.schema = new SimpleSchema({
...
subdocuments: {
label: 'Sub Documents',
type: [SubDocumentSchema],
defaultValue: [],
optional: true
}
...
});
Documents.attachSchema(Documents.schema);然后,我按照通常的方式在客户端有一个容器,并有一个订阅:
...
var handle = Meteor.subscribe('documents.byId', documentId);
...
var document = Meteor.collection('documents').findOne();
... 问题描述
在react-native-meteor客户机上,只有在数组中没有子文档的情况下,客户端才正确地接收订阅数据。一旦添加了子文档,当我尝试从react本地重新订阅时,列表就会变为空。有趣的是,如果我已经订阅了,它仍然会注意到文档的变化,但是一旦我重新加载应用程序,它就找不到它了。
在服务器上,我检查了通过日志记录找到的文档,但是在客户机上,当我执行Meteor.collections('documents).findOne()时,它是空的,除非子文档字段是空的。
在流星服务器的web客户端上,如果我按ID订阅文档,那么无论有多少子文档,一切都很好。
问题
我怀疑这要么是某种简单的错误类型的错误,要么是react-native-meteor本身的问题。还有人能重新创造这个吗?我已经坚持了一段时间了--我唯一的猜测是,也许本机版本不知何故不满意这个模式?
编辑版本
React原生版本: 0.39.2
流星版本: 1.4.2.3
更新
在搜索并逐步遍历react-meteor-native代码以查看它正在做什么时,我发现有一次数据确实回来了!所以这可能是某种时间问题?
更新2
如果我筛选出服务器端的子文档数组,则本机客户端再次开始工作:
return Documents.find({documentId}, {
fields: {'subdocuments': 0}
}也许react-native-meteor不喜欢一些关于子文档格式/模式的东西..。
更新3
我从子文档数组中删除了"id“字段,现在一切正常。所以在子文档数组中有一个Meteor.Collection.ObjectID类型的字段是个问题.
发布于 2017-01-11 22:56:09
经过多次实验,我发现react-native-meteor的行为是错误的,这是因为我为子文档填充_id字段的方式。
最初,我一直将ID设置为:
var _id = new Meteor.Collection.ObjectID();但是,当我意识到这引起了问题之后,我就用了字符串版本来代替:
var _id = new Meteor.Collection.ObjectID().valueOf();而现在本地客户的行为。我不知道这是个解决办法还是我做错了什么.我的模式中的字段的类型设置为type: Meteor.Collection.ObjectID,但是它似乎对字符串和对象都很满意。
https://stackoverflow.com/questions/41599687
复制相似问题