【问题标题】: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();
  } 
});

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

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

彼得。

【问题讨论】:

    标签: javascript meteor user-roles


    【解决方案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 的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多