0

我正在流星中建立一个在线商店,客户可以在商店中定制产品。我已经设置了一个名为的仅限客户端的集合Inventory,它存储所有产品数据并根据用户输入进行相应更新。一旦用户准备好结账,我将产品数据转储到名为ShoppingCart. 我希望允许用户返回并修改他们对产品的编辑,因此如果找到匹配Inventory项,我将路由器设置为来自$setin 的数据:ShoppingCartInventory

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编辑:每当数据发生变化时,这似乎会导致我的路由器方法陷入无限循环。有没有办法避免这个问题?我应该考虑有更好的方法来处理这种数据吗?

4

1 回答 1

1

主要警告- 我不做 CoffeeScript,所以这是我通过编译器收集到的代码。

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

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

最后一件事,只是因为我不明白:您为什么需要将商品从 ShoppingCart 转储回 Inventory?除非用户开始了新会话,否则它不应该已经存在吗?

于 2015-01-02T19:02:41.917 回答