我正在 meteor 中建立一个在线商店,客户可以在商店中定制产品。我已经设置了一个名为Inventory
的仅限客户端的集合,该集合存储所有产品数据并根据用户输入进行相应更新。一旦用户准备好结账,我将产品数据转储到名为ShoppingCart
的客户端和服务器端集合中。我想允许用户返回并在Inventory
中修改他们对产品的编辑,因此我将路由器设置为$set
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
编辑:这似乎导致我的路由器方法陷入无限循环,每当Inventory
中的数据发生变化时。有什么方法可以避免这个问题吗?有没有更好的方法来完全处理我应该考虑的此类数据?
主要警告 - 我不做 CoffeeScript,所以这是我可以通过编译器将您的代码收集到的。
我认为问题是数据函数是反应性的,并且您正在从其中的库存集合中更新和返回项目。每次路由运行时,除非没有storedItem
,否则它将使它本身所依赖的计算无效,从而立即再次重新运行(随后再次执行相同的操作,等等......
作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的主意 - 如果您必须在路由函数中执行此操作,请考虑onRun
或onBeforeAction
钩子进行更新。
最后一件事,只是因为我不明白:为什么您需要将商品从购物车转储回库存中? 除非用户已启动新会话,否则它不应该已经存在吗?