0

我试图使用 Session.get() 和 Session.set() 来检查用户是否单击了按钮。如果实现此代码以检查会话是否已设置。

"click .alt": function(event,template){

        if (Session.get("selected") === false){
            var clicked = event.currentTarget;
            clicked.className += " chosen";
            var data = clicked.dataset; 
            console.log(data);
            Session.set("selected", true);
        if (data.corr == true){
            console.log("Hi");
        }
        else{
            console.log("Not Hi");
        }
    }
    else{
        console.log("session was set to true");
    }
}

consol.log(data) 总是被打印,但即使 data.corr=true,“Hi”也会被更新。出于某种未知的原因,对我来说,这不起作用。希望有人可以帮助我。

更新 这将不起作用:

    if (Session.get("selected") == false){
        Session.set("selected", true);
        var clicked = event.currentTarget;

        if (clicked.dataset.corr == true){
            //Recording the time and calculating some points                
            time = new Date;
            time = time.getTime();
            time = 3000-Math.floor((time -Session.get("startedTime"))/10 );
            gameCol.insert({team:Session.get("teamnr"), points: time});
            console.log("Correct answer");
        }
        else{
            //0 points for wrong answer
            gameCol.insert({team:Session.get("teamnr"), points: 0});
            console.log("Wrong answer");
        }
    }
    else{
        console.log("You have answered");
    }

这有效:

    if (Session.get("selected") == false){
        Session.set("selected", true);
        var clicked = event.currentTarget;

        if (clicked.dataset.corr == true){
            //Recording the time and calculating some points                
            time = new Date;
            time = time.getTime();
            time = 3000-Math.floor((time -Session.get("startedTime"))/10 );
            gameCol.insert({team:Session.get("teamnr"), points: time});
            console.log("Correct answer");
        }
        else{
            //0 points for wrong answer
            //gameCol.insert({team:Session.get("teamnr"), points: 0});
            console.log("Wrong answer");
        }
    }
    else{
        console.log("You have answered");
    }

唯一的区别是在 db 中插入错误答案的行是 remover。见行 //gameCol.insert({team:Session.get("teamnr"), points: 0});

更新 1.1 将 if/else 更改为两个 if 反而有效

if (clicked.dataset.corr == true){
            //Recording the time and calculating some points                
            time = new Date;
            time = time.getTime();
            time = 3000-Math.floor((time -Session.get("startedTime"))/10 );
            gameCol.insert({team:Session.get("teamnr"), points: time});
            console.log("Correct answer");
        }
        if(clicked.dataset.corr == false){
            //0 points for wrong answer
            gameCol.insert({team:Session.get("teamnr"), points: 0});
            console.log("Wrong answer");
        }
4

3 回答 3

0

它确实有效。我将您的代码(删除了一些我不知道它的用途的东西)添加到香草流星项目中,它工作得很好。

我使用创建了一个项目mrt create,这段代码在每次点击 hello-template 时将会话设置为 true。

if (Meteor.isClient) {

  Meteor.startup(function() {
    Session.set("selected", false);
  });

  Template.hello.greeting = function () {
    return "Welcome to so-q.";
  };

  Template.hello.events({
    "click": function(event,template){

      if (Session.get("selected") === false){
        console.log("session was set to false");
        Session.set("selected", true);
      }
      else{
        console.log("session was set to true");
        Session.set("selected", false);
      }
    }
  });

}

if (Meteor.isServer) {
  Meteor.startup(function () {
// code to run on server at startup
});
}
于 2013-04-17T14:58:48.977 回答
0

尝试if (Session.equals('selected', false))代替if (Session.get('selected') === false. 它应该工作。

于 2013-04-18T02:11:09.937 回答
0

我想我发现了问题所在,可能是我对 Meteor 的理解不够。我认为,当在模板中使用响应式数据时,任何绑定模板数据的更改都会触发模板中所有绑定数据的重新计算。会话数据也在模板中绑定的函数中设置和使用。因此,一旦触发重新计算,会话就会再次设置为 false。

一旦我将模板分成较小的部分,每个部分都包含一个单独的模板,这种行为就结束了。

于 2013-04-25T21:07:30.213 回答