Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 用fetch优化反应火焰_Sorting_Dom_Meteor_Meteor Blaze - Fatal编程技术网

Sorting 用fetch优化反应火焰

Sorting 用fetch优化反应火焰,sorting,dom,meteor,meteor-blaze,Sorting,Dom,Meteor,Meteor Blaze,当使用光标渲染时,Blaze的一个很好的特性是它自动将dom中的每个字段连接到集合中的每个字段,使每个dom集合元素都是被动的。这将最小化屏幕重画 但不幸的是,对于我的应用程序,在呈现显示之前,我必须在客户端对我的收藏进行大量排序。这意味着我必须提取所有要显示到客户机中的数据,对其进行排序,然后显示。Fetch会中断基于字段的反应,并使我的应用程序重新提取集合中每次更改的所有数据 是否有一种处理此问题的推荐方法,以便我可以使我的呈现对集合中单个文档中的更改做出更大的响应,而无需每次刷新整个集合

当使用光标渲染时,Blaze的一个很好的特性是它自动将dom中的每个字段连接到集合中的每个字段,使每个dom集合元素都是被动的。这将最小化屏幕重画

但不幸的是,对于我的应用程序,在呈现显示之前,我必须在客户端对我的收藏进行大量排序。这意味着我必须提取所有要显示到客户机中的数据,对其进行排序,然后显示。Fetch会中断基于字段的反应,并使我的应用程序重新提取集合中每次更改的所有数据

是否有一种处理此问题的推荐方法,以便我可以使我的呈现对集合中单个文档中的更改做出更大的响应,而无需每次刷新整个集合


我认为可能有一种方法可以观察集合上的更改,然后使用jquery对我的dom进行适当的更改。有人尝试过这种优化技术吗?有什么建议吗?

根据我的经验,需要一个流星光标来优化每个循环的反应式渲染

var myItems = new Mongo.Collection(null);
var dataReceived = [{myField: 'item1'}, {myField: 'item2'}, {myField: 'item3'}];
for (i in dataReceived) {
  myItems.insert(dataFromOtherSource[i]);
}

Template.myItems.helpers({
  getMyItems: function () {
    return myItems.find({}, {sort: [['myField', 'asc']]});
  }
});
如果您从Meteor出版物获取项目,则可以在客户端对其进行排序,而无需获取,因此不会导致任何不必要的重新渲染

var myItems = new Mongo.Collection('myItems');
Meteor.subscribe('myItems');

Template.myItems.helpers({
  getMyItems: function () {
    return myItems.find({}, {sort: [['myField', 'asc']]});
  }
});
如果您的数据来自其他来源,如外部REST API,或者如果数据是在客户端上创建的,则可以将数据存储在本地mini mongo集合中,而不是客户端上的常规JS数组中,以便为#each循环获取流星光标

var myItems = new Mongo.Collection(null);
var dataReceived = [{myField: 'item1'}, {myField: 'item2'}, {myField: 'item3'}];
for (i in dataReceived) {
  myItems.insert(dataFromOtherSource[i]);
}

Template.myItems.helpers({
  getMyItems: function () {
    return myItems.find({}, {sort: [['myField', 'asc']]});
  }
});

现在,您可以在“myItems”中插入、删除或编辑数据,并且只重新呈现数据的更改部分。另外,我想,您可以在模板帮助器中更改排序参数,渲染仍然是最佳的。

如果返回一个获取的文档数组,其中每个文档都有一个id,您应该会看到与使用光标相同的性能特征。这不是您观察到的吗?DW,当集合中的任何一个文档发生更改时,它重新绘制并重新显示整个文档阵列。这是因为我使用fetch。如果没有获取,它只会重新显示更改的文档。我想知道是否有人在这种情况下使用了observeChanges和jquery来提高性能,这是否显著提高了性能。您的第一个建议很有意义,只是我的排序,有时我的搜索参数太复杂,无法在find查询中表达。我必须提取记录的超集,然后在代码中过滤它们,然后在显示它们之前对结果进行排序。如果我可以将我的记录超集拉入临时集合,在显示之前对集合进行过滤和排序,那么这可能会起作用;但我怀疑,在这个过程中,我会失去原始客户数据库的反应能力。如果Mongo不能进行过滤和排序,我猜每当你重新计算临时集合的项目时,你就会失去最佳的#每次重新渲染。但至少在只有临时集合的mongo查询发生更改的情况下,您的解决方案可以保持最佳呈现。我很想知道你的结局。谢谢。我现在想,我可以使用observe和write对一个临时集合进行过滤和排序。因为我使用的是observe,所以我应该能够从临时收集到显示进行优化,并且我可能能够优化整个过程。我会让你知道如果我开发一个有效的解决方案。谢谢你的投入。我想我有一个计划:我会在我的收藏品上使用observe,并保留一个额外的临时本地收藏品。临时本地集合只需要我打算显示但经过筛选和排序的原始文档的_id。当observe事件出现时,我可以使用JS在临时集合中添加、删除或重新排列适当的ID。为了提高效率,模板将使用forEach在临时集合上使用光标。模板的每个助手都会使用临时集合中的_id来访问主集合进行显示。没问题。听起来是个聪明的解决方案!