Javascript Meteor.js服务器端代码能否对客户端上的会话变量作出反应

Javascript Meteor.js服务器端代码能否对客户端上的会话变量作出反应,javascript,node.js,meteor,Javascript,Node.js,Meteor,有没有办法让服务器上的代码对客户端上的Session.variable作出反应 例如: 我最初的想法是让客户端代码通过方法调用将会话变量的值连续发送到服务器,但这似乎不是很有效。会话在服务器端不起作用,但您最初的想法是一个好的开始 与连续发送该会话值不同,只需在客户端上有一个模板助手,该模板助手获取会话值并使用该值调用Meteor方法。这样只有当会话变量发生更新时,客户端助手才会对更改做出反应,并使用更新的值调用Meteor方法 // Client Template.main.helpers({

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

例如:


我最初的想法是让客户端代码通过方法调用将会话变量的值连续发送到服务器,但这似乎不是很有效。

会话在服务器端不起作用,但您最初的想法是一个好的开始

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

// Client
Template.main.helpers({
    reactiveHelper: {
        var reactiveValue = Session.get('fruit');
        Meteor.call('someMethod', reactiveValue);
    }
});

// Templates where you want this to happen
{{reactiveHelper}}

// Server
Meteor.methods({
    'someMethod': function(reactiveValue) {
        // Server code that reacts to client session changes
    }
});

你试过Tracker.autorun吗

Tracker.autorun(function () {
    Meteor.call('someMethod', Session.get('fruit'), function (err, res) {
        // do something with the result...
    });
});
仅当会话变量更改时(使用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');
    }
});

您发布的代码崩溃,因为服务器上没有
会话
,这不是很有趣。您是否可以发布使用方法调用发送
会话
数据的代码,并解释为什么它“似乎效率不高”?这就是我将如何处理它。只是想让您知道:来自dard12的答案也是如此。对于helper方法中的“Session.get”,只有在值发生更改时才会调用它。您可以说隐式Tracker.autorun在该助手中。这是由于会话变量造成的。@TomFreudenberg是的,但是OP没有显示
会话
值只能在一个模板中更改,因此可能需要一个“全局”
跟踪器。自动运行
。如果只在单个模板中使用,则首先不需要全局
会话
变量。。。虽然helper方法可以工作,但严格来说,它不是在模板中做事情的“正确”方法-我将在我的答案中添加一个例子。@MichaelMason我的评论只是一个“你知道吗”的评论。但由于
会话
是全局的,它将自动反映到应用程序中的所有这些部分,而不管该值的使用或更改频率如何。但当然,模板级别维护值的编辑方法是绝对正确的。
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');
    }
});