2014-11-18 3 views
1

Meteor 1.0을 사용하고 있습니다.Meteor.js - 템플릿 내에서 템플릿 도우미 호출하기

많은 계산을 수행하는 Template.*name*.rendered 함수가 있습니다. 계산이 끝나면 산출물을 Template.*name*.helpers으로 만들고 싶습니다. 그래서 해당 html 페이지에서 사용할 수 있습니다.

여기 코드의 단순화 된 버전입니다 : 내가 otherTemplate{{randomNum}}를 호출 할 때

Template.myTemplate.rendered = function() { 

    var x = Math.random(); 

    Template.otherTemplate.helpers({ 
    randomNum: x 
    }); 

} 

아무 일도 발생하지 않습니다.

Uncaught ReferenceError: x is not defined 

생각 :

또한 Template.*name*.renderedTemplate.*name*.helpers 외부,이 경우, 나는 오류가 퍼팅 시도?

+0

도 참조 [JS 코드에서 템플릿 헬퍼를 호출 (HTTP 나는이

~~~를 사용하고 방법의 예입니다 .com/questions/32042886/유창한 - 템플릿 - 도우미 - 콘솔 또는 기타 - js 코드). –

답변

5

Meteor의 작동 방식은 런타임이 아닌 응용 프로그램이 시작되기 전에 템플릿을 컴파일하는 것이므로 실제로는 올바른 방법이 아닙니다.

Session.setDefault('randomNum', 0); 

Template.myTemplate.rendered = function() { 
    Session.set('randomNum', Math.random()); 
} 

Template.otherTemplate.helpers({ 
    randomNum: Session.get('randomNum') 
}); 
:이 라인을 따라 뭔가 동안 가능하다 ( Template.registerHelper를 사용하여 예를 들어), rendered 콜백에서 특정 값으로 반응성 변수를 설정하고 그 대신에 반환하도록 설정 도우미가 훨씬 더 좋을 것이다

randomNum에 개인 변수를 사용하려면 ReactiveVar을보십시오. 그것은 어떤 반응적인 데이터 소스 일 수 있고 그것이 효과가 있습니다.

+0

그건 더 의미가있어! 감사. 세션 변수는 갈 길이 멀다. – samcorcos

+0

그게 내가하는 방식 이잖아.하지만이게 내가 일하는 "옳은 길"이 아닌 것 같지만, 나는 더 좋은 또 다른 방법을 모른다. 누군가가 이것을보고 뭔가 더 잘 알고 있으면 소품을 줄 때 유성은 워크 플로에서 다소 흐리다! –

+0

템플릿 인스턴스에 결과를 첨부하는 것이 더 낫습니다 (그래서'this.randomNum = new ReactiveVar (...);'), 그 후에 꽤 견고한 워크 플로우처럼 보입니다. 유일한 대안은 iron-router * waitOn *과 같은 것을 사용하기 때문에 페이지가 렌더링되기 전에 계산이 완료되었음을 알 수 있습니다. 비 동시성에서 벗어나는 것은 없습니다! – richsilv

1

도우미를 템플릿의 개체로 만들었지 만, Meteor에서는 이제 도우미 함수 내에서 도우미를 만들어야하기 때문에 사용하지 않으 셨습니다. 이 기능

Template.*TemplateName*.__helpers.get('*HelperName*')(*Params*); 

그것이 일을 매우 간단한 방법을 사용해야하며 그것의 아주 깨끗한 때문에 전역 범위에서 기능을 유지 자바 스크립트를 통해 도우미를 호출하기 위해 이제

. // 유래 : 여기

Template.home.events({ 
    'click .pair': function(event) { 
     var _this = $(event.currentTarget); 
     Template.home.__helpers.get('pairDevice')(_this); 
    } 
}); 

Template.home.helpers({ 
    'devices' : function() { 
     return Session.get('devices'); 
    }, 
    'pairDevice' : function(elm) { 
     elm.fadeOut(); 
     $('.home-page').addClass('paired'); 
     var deviceList = [ 
      { 
       'name' : 'Patrick\'s Phone', 
       'UUID' : '234123,4n123k4nc1l2k3n4 l1k23n4l12k3nc4l12' 
      }, 
      { 
       'name' : 'Mike\'s Phone', 
       'UUID' : '734k23k4l2k34l2k34l2k34l2k3m' 
      }, 
      { 
       'name' : 'Edgar\'s Phone', 
       'UUID' : '567k56l7k4l56k7l5k46l74k56l74k5' 
      } 
     ]; 
     Session.set('devices', deviceList); 
    } 
}); 

~~~

관련 문제