如果添加子文档,React Native Meteor 订阅会中断
React Native Meteor subscription breaks if subdocument added
概览(简体)
我是 运行 一个 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
不喜欢子文档 format/schema...
[更新 3]
我实验性地从子文档数组中删除了 "id" 字段,现在一切正常。所以在子文档数组中有一个 Meteor.Collection.ObjectID
类型的字段是一个问题...
经过多次试验,我发现 react-native-meteor
行为异常是因为我填充子文档的 _id
字段的方式。
本来我是设置ID为:
var _id = new Meteor.Collection.ObjectID();
但是当我意识到这是导致问题的原因后,我改用了字符串版本:
var _id = new Meteor.Collection.ObjectID().valueOf();
现在本机客户端正常运行。我不确定这是否算作一种解决方法,或者我是否首先做错了什么......我的模式中的字段的类型设置为 type: Meteor.Collection.ObjectID
但它似乎对两个字符串都很满意和对象。
概览(简体)
我是 运行 一个 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
不喜欢子文档 format/schema...
[更新 3]
我实验性地从子文档数组中删除了 "id" 字段,现在一切正常。所以在子文档数组中有一个 Meteor.Collection.ObjectID
类型的字段是一个问题...
经过多次试验,我发现 react-native-meteor
行为异常是因为我填充子文档的 _id
字段的方式。
本来我是设置ID为:
var _id = new Meteor.Collection.ObjectID();
但是当我意识到这是导致问题的原因后,我改用了字符串版本:
var _id = new Meteor.Collection.ObjectID().valueOf();
现在本机客户端正常运行。我不确定这是否算作一种解决方法,或者我是否首先做错了什么......我的模式中的字段的类型设置为 type: Meteor.Collection.ObjectID
但它似乎对两个字符串都很满意和对象。