流星:在助手之间共享变量

时间:2014-06-08 10:01:34

标签: meteor

我目前正在Meteor中构建一个quizz应用程序,并且在帮助程序中有三个功能

Template.quizPage.helpers({
//this helper finds the currentquiz and returns the currentquestion to the template

 question: function(){
     currentquiz = this.quiztitle;
     currentQuestion = Session.get('currentQuestion') || 0;
     return Quizzes.findOne({'quiztitle': currentquiz}).quizquestions[currentQuestion]
 },

 length: function (){
     questionlength = $(Quizzes.findOne({'quiztitle': currentquiz}).quizquestions).length;
     return questionlength;
 },

 answers: function(){
     currentquiz = this.quiztitle;
     currentQuestion = Session.get('currentQuestion') || 0;
     return Quizzes.findOne({'quiztitle': currentquiz}).answers[1][currentQuestion]
 }

});

正如您所看到的,这些代码中的一些已经重复(currentquiz = this.quiztitle)。 如何在帮助程序中的函数之间共享currentquiz?

这成为一个真正的问题,因为我需要一次定义变量currentquiz

 currentQuestion = [0,0,0,0,0];

但是,当我在模板中激活帮助程序时,当前代码会重置当前问题。我可以在函数$(document.ready)wrap上面定义它来设置变量或定义它。这真的很容易吗?

2 个答案:

答案 0 :(得分:0)

我知道这是一个老线程,但我遇到了同样的问题。您可以做的是在模板级别定义一个反应变量:

var abc;
Template.XY.rendered = function(){
  abc = new ReactiveVar("abc");
},

Template.XY.helpers({
  someFunction:function(){
  return abc.get();
}
)}

我定义了一个var abc;来将变量绑定到模板实例(我想这也可以用this.abc = new ...完成)

答案 1 :(得分:0)

要提供模板助手和事件中可用的变量,您只需将其添加到模板实例中。

onCreated 功能中,您可以使用关键字 this 访问模板实例。

Template.myTemplate.onCreated(function(){
    this.mySharedVariable = new ReactiveVar("myValue");
});

在帮助程序中,您可以使用 Template.instance()访问templace实例。

Template.myTemplate.helpers({
    myHelper1(){
        const instance = Template.instance();
        instance.mySharedVariable.get(); // Get the value "myValue"
        // Do something
    },
    myHelper2(){
        const instance = Template.instance();
        instance.mySharedVariable.get(); // Get the value "myValue"
        // Do something
    }
});

在事件中,您可以使用函数的第二个参数访问模板实例。

Template.myTemplate.events({
    'click .js-do-something' : function(event, instance){
        instance.mySharedVariable.set("newValue");  // Set the value "newValue"
    }
});

在上面的示例中,我使用了ReactiveVar,因此如果其值发生变化,则会重新执行两个帮助 myHelper1 myHelper2 。但可以根据需要随意使用正常变量。

PS:因为会话是全球性的,如果你只使用这个"分享"你不应该使用Session 模板中的变量。