我花了很多时间在我的流星应用程序上,现在用户进来了,它太慢了!几乎无法使用,特别是在移动设备上。
我不得不修改我的所有代码并尝试将所有逻辑传递给服务器,以便客户端不会过载。
但是,我遇到了很多问题。我尝试过所有类型的解决方案,但没有任何效果。
无论如何,这是手头的问题。当我尝试使用服务器端方法时,会触发一个无限循环,这将使服务器上的console.log成千上万次。
这是代码
on templates / question.js
Template.questionItem.helpers({
editPermission: function(){
var question = this
Meteor.call('checkForEditPermission', question, function(error, result){
console.log(result)
Session.set('editPermissionVar', result)
});
return Session.get('editPermissionVar')
}
});
on server / question.js
if (Meteor.isServer) {
Meteor.startup(function() {
Meteor.methods({
checkForEditPermission: function(question) {
if (Meteor.user() && (question.user_id == Meteor.userId())) {
return true
}
}
});
});
}
这是一个非常简单的帮手。我有许多其他更复杂的助手,但我无法弄清楚如何将它们放在服务器端。我被教导要在客户端做事,从来没有意识到我超载它。
不确定这是否有帮助,但我以前所拥有的(客户端唯一帮助者)要简单得多:
editPermission: function(){
if (currentUser && (this.user_id == currentUser._id)) {
return true
}
}
不需要meteor.call。
问题是,你如何处理从客户端调用方法并将它们用作帮助程序。我尝试过很多东西,比如反应变量和会话变量,但似乎没什么用。我知道这个特殊的例子非常简单,并且不会花费太多的计算,但我认为原理与更复杂的助手相同。问题是如何将它们移动到服务器。
由于
答案 0 :(得分:1)
问题是,你如何处理调用方法
我如何处理Meteor.call,它会对数据库进行更改,只显示带游标的数据。
例如,你有一些模板,如:
Template.exammple.events({'click .sth' : function(event){
Meteor.call("serveside", {some: data});
return false;
});
在'serverside'中,我得到了所有的调用或数据库查询/插入/更新等
和帮手:
Template.example.helpers({
example : function(){
return dbCollectionName.find();
});
通过这种方式,我不需要使用Meteor.call来提取数据/结果。大多数情况下,我将结果保存为原始形状,然后在用光标拉动它们之后再调整diplaying。 MongoDB与meteor完美配合,如果你需要一些聚合,你可以使用这个扩展:Meteor Aggregate