我对Meteor很新.我有一个相当小的数据集,<1000条记录的应用程序,我构建了一个相当天真的过滤器为您的类型实现.
现在,性能非常糟糕 - 每个按键都会导致浏览器在相对较快的计算机上遵守冻结一两秒.
它目前已autopublish启用并正在客户端做一切,我知道这是问题的一个重要部分,我只是不确定如何改进它.
这是相关的代码段:
Template.results.codes = function () {
var query = Session.get("query")
// todo: figure out if there's a better way to do this
var search = (query && query.length > 3) ? {$where: function() {
return this.code.indexOf(query) != -1;
}} : {}
return Codes.find(search);
};
Run Code Online (Sandbox Code Playgroud)
您可以在https://github.com/nfriedly/Meteor-ODB-II上查看完整资源,并在http://odb-ii.meteor.com/上试用.
我有的具体问题:
欢迎来到流星!如果这是一个生产应用程序,我的第一个评论是你不应该使用自动发布 - 尤其不是1k记录.正确的方法是使用更复杂的分页框架.除此之外,我们可以通过一些调整使您当前的UI更快:
where.这本身就是一个巨大的胜利.isMatch调用codes这是一个相当大的性能,因为它重新运行已经很昂贵的查询两次.相反,我们可以用会话变量替换此调用.> 1看起来仍然很快.但你应该调整味道.以下是我的更改:
Template.results.codes = function () {
var query = Session.get('query');
var cursor = query && query.length > 1 ? Codes.find({code: new RegExp(query)}) : Codes.find({}, {limit: 100});
Session.set('isMatch', cursor.count() > 0);
return cursor;
};
Template.results.isMatch = function() {
return Session.get('isMatch');
};
Run Code Online (Sandbox Code Playgroud)
这是一个如何在运行后完成这项工作的简单示例meteor remove autopublish.
向您的客户添加订阅:
Tracker.autorun(function() {
Meteor.subscribe('codes', Session.get('query'));
});
Run Code Online (Sandbox Code Playgroud)
将发布添加到您的服务器:
Meteor.publish('codes', function(query) {
if (query && query.length > 1) {
return Codes.find({code: new RegExp(query)});
} else {
return Codes.find({}, {limit: 100});
}
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以limit从该Template.results.codes功能中删除.在发布,我想你会需要调整使用的limits,并query.length在一个巧妙的方法,但这应该让你开始.我希望有所帮助!
| 归档时间: |
|
| 查看次数: |
1821 次 |
| 最近记录: |