概述(简体)
我正在运行一个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-native重新订阅时,列表将变为空。有趣的是,如果我已经订阅,它仍然会注意到文档的更改,但是一旦我重新加载应用程序,它就再也找不到了。
在服务器上,我已经检查过通过日志记录找到了文档,但是当我执行Meteor.collections('documents).findOne()
时它在客户端上,除非子文档字段为空,否则它是空的。
在meteor服务器的Web客户端上,如果我按ID订阅文档,无论有多少子文档,一切都很好。
问题
我怀疑这可能是某种简单的拼写错误,或者是react-native-meteor
本身的问题。其他人可以重新创建吗?我已经坚持了一段时间 - 我唯一的猜测是,本机版本可能不满意这种架构吗?
[修改] 版本
React-Native版本:0.39.2
流星版:1.4.2.3
[更新]
在搜索react-meteor-native
代码以查看它在做什么的同时,我发现有一次数据确实回来了!那么这可能是某种时间问题?
[更新2]
如果我过滤掉服务器端的子文档数组,本机客户端将再次开始工作:
return Documents.find({documentId}, {
fields: {'subdocuments': 0}
}
也许react-native-meteor
不喜欢关于subdoc格式/架构......
[更新3]
我实验性地从子文档数组中删除了“id”字段,现在一切正常。因此,在子文档数组中有一个类型为Meteor.Collection.ObjectID
的字段是一个问题...
答案 0 :(得分:0)
经过多次实验,我发现react-native-meteor
由于我填充子文档的_id
字段的方式而行为不端。
最初,我一直将ID设置为:
var _id = new Meteor.Collection.ObjectID();
但是一旦我意识到这会导致问题,我就改用了字符串版本:
var _id = new Meteor.Collection.ObjectID().valueOf();
现在本机客户端正在表现。我不确定这是否算作一种解决方法,或者我是否在第一时间做错了...我的架构中的字段的类型设置为type: Meteor.Collection.ObjectID
但它似乎对这两个字符串感到满意和对象。