如何避免我的流星路由器出现无限循环



我正在 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,否则它将使它本身所依赖的计算无效,从而立即再次重新运行(随后再次执行相同的操作,等等......

作为一般规则,我认为从数据函数中更新集合确实是一个非常糟糕的主意 - 如果您必须在路由函数中执行此操作,请考虑onRunonBeforeAction钩子进行更新。

最后一件事,只是因为我不明白:为什么您需要将商品从购物车转储回库存中? 除非用户已启动新会话,否则它不应该已经存在吗?

最新更新