Meteor阻止在每次编辑时重新加载数据?

时间:2013-12-16 21:14:41

标签: meteor

我正在开发我的第一个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时。再次下载所有附件(图像文件),并再次填充所有结果(使用参考键)。

问题不在于更新的速度。这是所有这些数据的重新加载,没有改变。

1 个答案:

答案 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}
  });
});

这有助于您只是为每个文档发布大量额外数据。如果您在线路上放置的数据较少,您的文档将更快地同步。