车把功能导致代码中的紧密循环
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 中的每个循环