如何避免在我的流星路由器中出现无限循环?
How can I avoid an infinite loop in my meteor router?
我正在 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,所以这是我将您的代码通过编译器后可以收集到的信息。
我认为问题在于数据函数是反应性的,并且您正在更新 和 从其中的 Inventory 集合返回一个项目。每次路由运行时,除非没有 storedItem
,否则它将使它本身所依赖的计算无效,从而立即重新运行(并随后再次执行相同的操作,等等)。
作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的主意 - 如果您必须在路由函数中执行此操作,请考虑 onRun
,或 onBeforeAction
更新挂钩。
最后一件事,只是因为我不明白:为什么你需要将购物车中的商品转储回库存中?除非用户开始新会话,否则它不应该已经存在了吗?
我正在 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,所以这是我将您的代码通过编译器后可以收集到的信息。
我认为问题在于数据函数是反应性的,并且您正在更新 和 从其中的 Inventory 集合返回一个项目。每次路由运行时,除非没有 storedItem
,否则它将使它本身所依赖的计算无效,从而立即重新运行(并随后再次执行相同的操作,等等)。
作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的主意 - 如果您必须在路由函数中执行此操作,请考虑 onRun
,或 onBeforeAction
更新挂钩。
最后一件事,只是因为我不明白:为什么你需要将购物车中的商品转储回库存中?除非用户开始新会话,否则它不应该已经存在了吗?