2015-01-02 4 views
0

저는 고객이 상점의 제품을 사용자 정의 할 수있는 유성에 온라인 상점을 구축하고 있습니다. 모든 제품 데이터를 저장하고 사용자 입력에 따라 업데이트되는 Inventory이라는 클라이언트 전용 모음을 설치했습니다. 사용자가 결제 할 준비가되면 제품 데이터를 ShoppingCart이라는 클라이언트 & 서버 측 콜렉션에 덤프합니다.유성우 내 라우터에서 무한 루프를 피하려면 어떻게해야합니까?

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 

편집 : 그것은 일치가 발견되면 나는 사용자가 돌아가서 InventoryShoppingCart에서 $set 데이터에 Inventory 그래서 설정에서 내 라우터를 제품에 자신의 편집을 개정 할 수 있도록하려면이 발생할 것으로 보인다 내 라우터 메서드는 Inventory의 데이터가 변경 될 때마다 무한 루프에서 멈추게됩니다. 이 문제를 피할 수있는 방법이 있습니까? 이런 종류의 데이터를 처리 할 수있는 더 좋은 방법이 있습니까?

답변

1

전공 견적 - 저는 CoffeeScript를 사용하지 않습니다. 따라서 저는 컴파일러를 통해 코드를 작성함으로써 수집 할 수 있습니다.

문제는 데이터 기능이 반응적이고 사용자가 을 업데이트하여 그 안에있는 인벤토리 컬렉션의 항목을 반환한다는 것입니다. 경로가 실행될 때마다 storedItem이 없으면 자체 계산이 무효화되어 즉시 다시 실행됩니다.

일반적으로 데이터 함수 내에서 컬렉션을 업데이트하는 것은 매우 나쁜 생각입니다. 경로 기능 내에서이 작업을 수행해야하는 경우 onRun 또는 onBeforeAction 후크를 고려하여 업데이트하십시오.

내가 이해하지 못하는 이유는 무엇인가 : 왜 쇼핑 카트에서 상품을 인벤토리로 다시 가져와야합니까? 사용자가 새 세션을 시작하지 않으면 이미 존재하지 않아야합니까?

+0

아이디어는 데이터를 덤프하여 새 세션이 시작될 때도 데이터가 존재할 수 있도록하는 것이지만 분명히 내 접근 방식이 잘못되었습니다. 이를 달성하는 가장 좋은 방법은 다른 응용 프로그램 상태에 대해 별도의 인스턴스 대신 동일한 (영구적 인) 컬렉션을 사방에 사용하는 것입니다. 어떻게 생각해? – gaplus

관련 문제