这就是我所拥有的:
模板:
<body>
{{> resultSession}}
{{> resultMethod}}
</body>
<template name="resultSession">
<button>Click me</button>
<p>Session.get('length') returned {{returned}}</p>
</template>
<template name="resultMethod">
<p>Meteor.call returned {{returned}}</p>
</template>
客户端:
Template.resultSession.events({
'click button': function () {
Session.set('length', Math.floor((Math.random() * 20) + 1));
}
});
Template.resultSession.helpers({
returned: function () {
return Session.get('length');
}
});
Template.resultMethod.helpers({
returned: function() {
Meteor.call('returnArray', Session.get('length'), function (err, res) {
return res.length;
});
}
});
服务器端:
Meteor.methods({
'returnArray': function (length) {
var arr = [];
arr[length - 1] = 0;
return arr;
}
});
TL; DR
您可以在http://meteorpad.com/pad/AkBZq4ZFjJuQuzztz/Meteor.call-on-Session-change
查看代码并进行播放如您所见,我的方法接受number
并返回长度等于number
的数组。
问题是每次 Meteor.call
变量时,我怎样才能 Session
P.S。值会故意返回两个不同的模板
答案 0 :(得分:2)
您的反应式代码运行正常。 如果你在Meteor.call中放入一个console.log,你会看到正确的答案从服务器返回。
Template.resultMethod.helpers({
returned: function() {
Meteor.call('returnArray', Session.get('length'), function (err, res) {
console.log('it came back ' + res.length);
return res.length;
});
}
});
我已将一个Session变量放入服务器的返回中,所以现在您可以看到您的被动代码非常简单 - 无需复杂的自动运行。
<template name="resultMethod">
<p>Meteor.call returned {{returned}}</p>
</template>
然后在resultMethod帮助器中:
Template.resultMethod.helpers({
returned: function() {
Meteor.call('returnArray', Session.get('length'), function (err, res) {
Session.set('fromServer', res.length + '');
});
return Session.get('fromServer');
}
});
答案 1 :(得分:1)
像@saimeunt所说,使用Tracker.autorun
模板:
<body>
{{> resultSession}}
{{> resultMethod}}
</body>
<template name="resultSession">
<button>Click me</button>
<p>Session.get('length') returned {{returned}}</p>
</template>
<template name="resultMethod">
<p>Meteor.call returned {{returned}}</p>
</template>
代码:
Template.resultMethod.rendered = function() {
this.autorun(function (){
Meteor.call('returnArray', Session.get('length'), function (err, res) {
Session.set('result', res);
});
});
}
Template.resultSession.helpers({
returned: function () {
return Session.get('length');
}
});
Template.resultMethod.helpers({
returned: function() {
return Session.get('result');
}
});
在未呈现模板时自动运行渲染停止内部 p>
答案 2 :(得分:0)
您可以简单地重构代码以在Click事件上调用Meteor方法吗?
#include <boost/function.hpp>
#include <iostream>
double Function0()
{
std::cout << "Function0()" << std::endl;
return 2.2;
}
template <typename T>
class MyClass
{
public:
boost::function<double ()> MyFunctionPointer2 =
&Function0; // doesn't work, unless I define a constructor
// error: conversion from 'double (*)()' to non-scalar type 'boost::function<double()>' requested
MyClass(){}
};
int main ()
{
MyClass<int> a;
return 0;
}
您还可以使用Template.resultSession.events({
'click button': function () {
var length = Math.floor((Math.random() * 20) + 1);
Session.set('length', length);
Meteor.call('returnArray', length, function (err, res) {
Session.set('result', res.length);
});
}
});
Template.resultSession.helpers({
returned: function () {
return Session.get('length');
}
});
Template.resultMethod.helpers({
returned: function() {
return Session.get('result');
}
});
跟踪Tracker.autorun
变量的修改并重新运行任意代码。
Session