如何在流星路由器中避免无限循环?

时间:2015-01-02 17:41:18

标签: meteor iron-router minimongo

我正在meteor中建立一个在线商店,客户可以在商店中定制产品。我设置了一个名为Inventory的仅限客户端的集合,它存储了所有产品数据,并根据用户输入进行相应更新。一旦用户准备结账,我将产品数据转储到客户端&服务器端集合称为ShoppingCart。我想允许用户在Inventory中返回并修改对产品的修改,以便我将路由器设置为$set的{​​{1}}数据ShoppingCart如果找到匹配:

Inventory

编辑:这似乎导致我的路由器方法在Router.route '/:_type/:_id', -> Session.set "inCart", false @render @params._type, data: => storedItem = ShoppingCart.findOne { userId: Meteor.userId(), image: @params._id } if storedItem? delete storedItem._id Inventory.update {image: @params._id}, { $set: storedItem } Inventory.findOne image: @params._id 中的数据发生变化时陷入无限循环。有没有办法避免这个问题?有没有更好的方法来处理这类数据我应该考虑?

1 个答案:

答案 0 :(得分:1)

MAJOR CAVEAT - 我不做CoffeeScript,所以这是我通过编译器放置代码时可以收集的内容。

我认为问题在于数据功能是被动的,并且您正在更新从其中的Inventory集合中返回项目。每次路由运行时,除非没有storedItem,否则它将使其自身所依赖的计算无效,从而立即重新运行(并且随后再次执行相同的操作等)。

作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的想法 - 如果必须在路由函数中执行此操作,请考虑onRun,或者onBeforeAction挂钩进行更新。

最后,仅仅因为我不明白:为什么你需要将ShoppingCart中的商品转回库存?除非用户已经开始新会话,否则它不应该存在吗?