Handlebars函数导致代码中出现紧密循环

Handlebars function causing tight loop in code

本文关键字:循环 函数 代码 Handlebars      更新时间:2024-06-17

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

在应用程序中,我在一条路线上有一个卸载功能,它会增加一个值来计数和显示项目的浏览次数。

   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

彼得。

我猜卸载函数会给你带来一些悲伤。当您执行findOne时,var项目会变为被动的,并且会观察到对它的任何更新(就像您在它下面执行的更新一样)。您实际上不需要执行findOne,只需直接更新即可,因为id在params中。尝试

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

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