2013-12-10 17 views
0

我似乎在我的应用程序中遇到了一个阻碍,导致浏览器进入一个永无止境的非常紧密的循环。Handlebars功能导致代码中出现严密的循环

在应用程序中,我在路径上有一个卸载函数,该函数递增一个值来计算并显示项目被查看的次数。

unload: function() { 
     var project = projectDocs.findOne(this.params._id); 
     // need to increment views value by one 
     projectDocs.update(project._id, 
     {$inc: {views: 1}} 
    ); 
    } 
    }); 

这很好,直到我尝试启用基于用户角色(使用角色包)的窗体上的按钮。启用按钮的代码如下(仅在div中)。

<a href="{{pathFor 'home'}}" class="btn btn-success {{#unless canQuote}} disabled {{/unless}}">Quote</a> 

的canQuote助手是

Template.projectPage.helpers({ 
    canQuote: function(){ 
    return Roles.userIsInRole(this.userId, ['tradie','admin']) 
    }, 
    isOwner: function(){ 
    return this.userId == Meteor.userId(); 
    } 
}); 

,直到一个用户登录的所有工作正常,按钮被禁用,一切都很好。当用户使用适当的角色登录时,页面只是简单地挂起来试图显示,而查看的计数只是在某个地方非常紧密的循环中上升。

有人可以给我一个线索为什么这是循环?

Ta

Peter。

回答

1

我的猜测是卸载功能给你一些悲伤。当你做一个findOne时,var项目变得被动,并且它的任何更新(比如你在它下面做的更新)都被观察到。您实际上不需要执行findOne,只需直接更新,因为id在参数中。尝试

unload: function() { 
     // need to increment views value by one 
     projectDocs.update(this.params._id, 
     {$inc: {views: 1}} 
    ); 
    } 
    }); 

编辑:实际上你可能最好把更新到挂钩,而不是卸载后,因为如果用户关闭窗口或东西卸载可能不会被调用,而之后将记录视图只要执行动作函数。

+0

谢谢你,这是解决了一些问题。我不能使用after hook,因为即使使用上面的代码也会生成一个循环,并且我在使用wait函数登录用户时仍然有用,并且永远不会结束我想(我只是最终显示加载模板(我把代码放进去了,但是注释不会) –

+0

好了,原来这是一个问题的组合,我没有理解Meteor.Roles包,正如陆地所指出的那样, findOne。谢谢。 –