有没有办法让服务器上的代码对客户端上的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()
}
}
我最初的想法是让客户端代码通过方法调用不断地将会话变量的值发送到服务器,但这看起来效率不高。
答案 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');
}
});