2016-11-21 1 views
0

다음은 내 템플릿 onCreated 및 도우미 함수입니다. 나는 약간의 명확성을 추가하기 위해 인라인 코멘트를 제공했다. template.instance()를 로그 할 때 내 콘솔에 나타나기 때문에 self.post가 결국 설정된다는 것을 알 수 있습니다. 그러나 Template.instance(). post를 기록하면 항상 정의되지 않습니다.템플릿 onCreated에서 findOne을 사용하고 도우미에서 액세스하는 방법

Template.default.onCreated(function() { 
    var self = this; 
    self.autorun(function() { 
     var postId = FlowRouter.getParam('post_id'); 
     self.subscribe('onePost', postId); 
     self.post = Posts.findOne(FlowRouter.getParam('post_id')); 
    }); 
}); 
Template.default.helpers({ 
    poststage: function(stage) { 
     console.log(Template.instance()); // I can see post object here 
     console.log(Template.instance().post; //always undefined 
     if(Template.instance().post) { 
      // never true 
      return Template.instance().post.stage == stage; 
     } 
    } 
}); 
Template.default.events({ 
    'submit form':function(event, instance) { 
     Meteor.call('someFunc', instance.post.anotherField); 
    } 
}); 

편집 : 필자는 템플릿 이벤트에서 사용하기 때문에 쿼리를 두 번 쓰는 것을 피하려고합니다. (코드 참조).

+0

Reactivevar가 meteorchef 반응 –

+0

findOne에 도움이 될 것은 기본적으로 반응이다. –

답변

0

타이밍 문제와 같은 느낌입니다. onePost 게시판을 구독 중이지만 구독을 기다리지 않고 self.post을 할당하기 전에 autorun도 불필요한 것으로 보입니다. onCreated 블록에서 해당 코드 블록을 다시 실행하지 않아도됩니다. 내가 제안 :

Template.default.onCreated(function() { 
    this.postId = FlowRouter.getParam('post_id'); 
    self.subscription = subscribe('onePost', this.postId); 
}); 
Template.default.helpers({ 
    poststage: function(stage) { 
    if (this.subscription.ready() ){ 
     return Posts.findOne(this.postId).stage; 
    } 
    } 
}); 
+0

그래, 그래, 내가 일반적으로 그것을했을거야,하지만 나중에 이벤트에서 코드에서 쿼리를 재사용이야. 나는 실제로 이것을 반영하기 위해 질문을 다시 쓰려고 생각하고 있었다. (나는 지금 그것을 할 것이다). 대답은 Posts.findOne ...을 다시 작성하는 것일 수 있습니다. 하지만, 왜 쿼리가 두 번 생각하고 있었습니까? –

+0

minimongo 쿼리는 상대적으로 저렴하며, 종종 최적화를 시도하는 모서리에 자신을 코딩하는 것보다 저렴합니다. 포함하는 템플릿에서 데이터 컨텍스트를 쿼리 할 수 ​​있습니다. 쿼리 결과는 'this'입니다. –

+0

그래, 이제 쿼리를 두 번 할 것입니다. 이 질문을 공개적으로 남겨두고 아마도 하나의 쿼리를 작성하고 템플릿 onCreated, 도우미 및 이벤트에서 사용하는 방법을 지정하기 위해 조금만 수정하십시오. 가장 실망스러운 점은 내 게시물은 console.log (Template.instance())에서 사용할 수 있다는 것입니다. Template.instance(). post에는 포함되지 않습니다. 나는 그것이 이용 가능하다는 것을 알고 있지만, 그것이 가능할 때 로깅해야만한다 .... 오 ... 글쎄 ... –

관련 문제