我正在开发我的第一个Meteor项目 - 接管了其他人的代码,其中80%的应用已经完成。
我们有一个相当大而复杂的对象模型,有点像:
something: { ... }
attachments: [ {...}, {...}, ...]
another-thing: { ... },
....
它是使用加载的(所以我们使用的是LocalCollection.Cursor
而没有获取):
Inspections.findOne({_id: inspection_id})
此对象填充一个模板,该模板被拆分为多个单独的组件模板。
在其中一个组件模板中,用户可以更新各种属性。例如,选择或取消选择附件:
Object.attachments[0].selected = true;
然后我们更新如此(其中updatedAttachments
是更新的附件数组):
InspectionOrders.update({ _id: inspection._id }, {
$set: {
attachments:updatedAttachments
}
});
问题是附件(和一些其他属性)从一个可能需要一段时间的一些其他数据加载。更改select
状态需要3-4秒才能重新渲染,因为所有这些小附件都会再次下载。
我的问题:
有没有办法处理更新此对象,而不需要在每次更改时下载此数据?
一般来说,将这个对象拆分成多个小对象是个好主意吗?如果更改了父级的属性,是否还需要重新加载所有对象?
我尝试在{{#isolate}}
中对模板的某些部分进行变形,但没有区别。
修改
数据结构有点像这样:
InspectionOrder
|
|- Attachments [file names]
|
|- Findings [keys]
加载页面或更新InspectionOrder
时。再次下载所有附件(图像文件),并再次填充所有结果(使用参考键)。
问题不在于更新的速度。这是所有这些数据的重新加载,没有改变。
答案 0 :(得分:0)
在没有查看数据的情况下,我对问题所处的位置有点不清楚,但是您可以尝试以下几种方法:
您可以只更新已更改的属性,而不是设置整个附件数组。例如:
InspectionOrders.update({_id: inspection._id}, {$set: {"attachments.0.selected": true}});
这有助于您拥有给定文档的大量附件。对于DB来说执行起来会更快,但是,我不清楚服务器是否只是将整个文档发布回用户。即这可能会有所帮助,但可能不是一个大赢家。
在服务器上,您可以尝试在发布时从InspectionOrders
中有选择地删除字段。例如:
Meteor.publish('inspectionOrders', function() {
return InspectionOrders.find({}, {
fields: {'attachments.hugeBinaryFile': 0}
});
});
这有助于您只是为每个文档发布大量额外数据。如果您在线路上放置的数据较少,您的文档将更快地同步。