0

顧客がストア内の製品をカスタマイズできるオンライン ストアを流星に構築しています。Inventoryすべての製品データを保存し、ユーザー入力に応じて更新されるというクライアントのみのコレクションをセットアップしました。ユーザーがチェックアウトする準備ができたら、製品データを というクライアントおよびサーバー側のコレクションにダンプしますShoppingCart。ユーザーが製品に戻って編集内容を修正できるようにしたいので、一致が見つかった場合にからデータを取得Inventoryするようにルーターをセットアップします。$setShoppingCartInventory

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 を使用していないため、これは、コードをコンパイラに通して収集できるものです。

問題は、データ関数が反応的であり、その中の Inventory コレクションからアイテムを更新して返すことだと思います。ルートが実行されるたびに、 が存在しない場合を除きstoredItem、それ自体が依存する計算が無効になり、すぐに再実行されます (その後、同じことを再度実行するなど...)。

原則として、データ関数内からコレクションを更新するのは非常に悪い考えだと思います。ルート関数内でこれを行う必要がある場合は、更新用のonRun、またはonBeforeActionフックを検討してください。

最後に、よくわからないので、なぜアイテムを ShoppingCart から Inventory に戻す必要があるのですか? ユーザーが新しいセッションを開始していない限り、既にそこにあるはずではありませんか?

于 2015-01-02T19:02:41.917 に答える