Meteor.js服务器端代码可以对客户端上的会话变量做出反应

时间:2015-10-23 13:30:57

标签: javascript node.js meteor

有没有办法让服务器上的代码对客户端上的Session.variable做出反应?

例如:

if(Meteor.isClient() {
    Template.main.events({
        'click #appleBtn': function() {
            Session.set('fruit', 'apples')
        }
    })
}


if(Meteor.isServer) {
    if(Session.get('fruit') == 'apples') {
        doSomething()
    } else {
        doAnotherThing()
    }   
}

我最初的想法是让客户端代码通过方法调用不断地将会话变量的值发送到服务器,但这看起来效率不高。

2 个答案:

答案 0 :(得分:2)

会话不会在服务器端工作,但您最初的想法是一个良好的开端。

而不是连续发送该会话值只是在获取会话值的客户端上有一个模板助手,并使用该值调用Meteor方法。这种方式当会话变量发生更新时,客户端帮助程序会对更改做出反应并使用更新的值调用Meteor方法。

viewer.camera.heading

答案 1 :(得分:1)

您是否尝试过Tracker.autorun

Tracker.autorun(function () {
    Meteor.call('someMethod', Session.get('fruit'), function (err, res) {
        // do something with the result...
    });
});

该方法仅在Session var更改时调用(在使用Session.get('fruit')的初始值运行一次后)

在你要做的服务器上:

Meteor.methods({
    someMethod: function (fruit) {
        if (fruit === 'apple') {
            doSomething();
        } else {
            doSomethingElse();
        }
    }
});

编辑:请参阅下面的评论,这是一个完全在单个模板中执行此操作的示例:

Template.MyTemplate.onCreated(function () { 
    this.fruit = new ReactiveVar('orange'); 
    var instance = this; 

    instance.autorun(function() {
        Meteor.call('myMethod', instance.fruit.get(), function (err, res) {
            // do something?
        });
    }); 
});

Template.MyTemplate.events({
    'click #myButton': function (event, tmpl) {
        tmpl.fruit.set('apple');
    }
});