2014-04-13 2 views
6

Iron-router가 렌더링 전에 내 컬렉션에서 성공적으로 find 메소드를 기다리고있는 솔루션을 찾고 있습니다.Iron-router는 렌더링 전에 데이터 객체로 Collection.findOne()을 대기합니다.

내 경로는 다음과 같습니다이 잘 작동

this.route('business', { 
     path : '/business/:type/:_id', 
     waitOn : function() { 
      return Meteor.subscribe('business', this.params._id); 
     }, 
     data : function() { 
      return Business.findOne({_id: this.params._id}); 
     } 
    }); 

. Iron-router는 Collection을 구독하면 클라이언트에 적합한 Document back을 얻을 수있을 때까지 기다리는 것 같습니다. 그러나 필자의 템플릿에 필요한 데이터는 findOne 함수에 지연이 있습니다. 같은 문제를 가진 사람에 대한

Template.businessItemItem.rendered = function() { 
    console.log(Router.current().data()); // undefined 
    window.setTimeout(function(){ 
     console.log(Router.current().data()); // [Object] 
    }, 1000); 
} 

솔루션 . 다음과 같이 경로에 '액션'메소드를 추가하십시오.

action : function() { 
    if (this.ready()) this.render(); 
} 

이 방법을 사용하면 모든 것이 정상적으로 작동합니다.

+0

당신은 내 영웅입니다! 이것은 나를 미치게했다. 솔루션은 완벽하지만 더 자세히 조사 할 것입니다. 철제 라우터의 버그 일 경우 github에 대한 문제를 열어야합니다. 감사! – physiocoder

+0

네, 그렇게해야한다고 생각합니다. reference : https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#waiting-on-subscriptions-waiton waitOn 메서드는 렌더링 전에 데이터를 기다리고 그것을 반환합니다. 내가 현재 무엇을하지 않습니다 ... – TJR

+0

데이터를 추가하기위한 빠른 업데이트는 data() 함수가 호출되기 전에 action() 메서드()를 호출하기 전에 브라우저에서 새로 고침 . 이 경우에도이 솔루션은 작동하지 않습니다 :-(그래서 나는이 게시물에서 제안한 것처럼 data() 메소드의 첫 번째 줄에'if (! this.ready()) return;'을 넣었습니다 : https : /groups.google.com/forum/#!topic/meteor-talk/lK3v9ZxIbco – physiocoder

답변

2

내가 문제가되는지 잘 모르겠지만, 만약 그렇다면 Controlling subscriptions, 특히 Router.onBeforeAction('loading')을 읽어야합니다. 이제, 당신은 바퀴를 재발 명하고 있습니다.

+0

의견을 보내 주셔서 감사합니다. 내 질문에 이미 수정 한 해결책을 참조하십시오. 사용중인 this.ready의 작업 방법은 정상적으로 작동합니다. – TJR

+0

기본적으로 기본 "로드 중"후크를 기록하기 때문에 작동합니다. 이는 모든 경로에 적용되기 때문에 더 좋습니다. 솔루션을 사용하면 모든 경로에서이 "작업"코드를 복사/붙여 넣기해야합니다. – saimeunt

+0

동일한 문제가 있습니다. 나는 waitOn() 훅을 사용해 보았고 아무것도하지 않는 것처럼 보였다. 나는 경로 대기를 만들기로되어있는 두 개의 subscribe() 호출 배열을 리턴했지만, 그렇지 않았다. 티모의 솔루션은 나를 위해 일했습니다. 아마도 철제 라우터에 버그가있을 수 있습니다. – Jachin