车把功能导致代码中的紧密循环

Posted

技术标签:

【中文标题】车把功能导致代码中的紧密循环【英文标题】:Handlebars function causing tight loop in code 【发布时间】:2013-12-27 11:27:46 【问题描述】:

我似乎在我的应用程序中遇到了一个障碍,导致浏览器进入一个永无止境的非常紧密的循环。

在应用程序中,我在路线上有一个卸载功能,该功能增加一个值以计算并显示项目被查看的次数。

   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();
   
);

这一切正常,直到用户登录。按钮被禁用,一切都很好。当用户使用适当的角色登录时,页面只是在试图显示时挂起,并且查看次数只会在某个地方非常紧密的循环中上升。

有人能告诉我为什么这是循环吗?

彼得。

【问题讨论】:

【参考方案1】:

我的猜测是卸载功能让你有些悲伤。当您执行 findOne 时,var 项目将变为响应式,并且会观察到对它的任何更新(例如您在其下方所做的更新)。您实际上不需要执行 findOne,只需直接更新,因为 id 在参数中。试试

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

编辑:实际上,您最好将更新放入 after 钩子而不是卸载,因为如果用户关闭窗口或其他东西,卸载可能不会被调用,而 after 将记录视图,只要操作函数已执行。

【讨论】:

谢谢你,这已经解决了一些问题。我不能使用 after 钩子,因为即使使用上面的代码也会生成一个循环,当我用等待功能登录用户时我仍然可以使用我认为永远不会结束(我只是最终显示加载模板(我会输入代码,但评论不会接受)。 好吧,原来这是一个问题的组合。我不理解 Meteor.Roles 包,正如陆地所指出的 findOne 的问题。谢谢。

以上是关于车把功能导致代码中的紧密循环的主要内容,如果未能解决你的问题,请参考以下文章

res.render 中的 Express-Node JS 车把模板:如何迭代?

使用车把和 Mandrill-dotnet -library 在 mandrill 中的每个循环

快速车把功能

candy/strophe - 使用 prebind (.attach) 会导致紧密的空闲循环?

车把中的索引运算符说 Unexpected token ,

用车把中的空格替换