如何在会话变量

时间:2015-05-12 19:53:14

标签: meteor meteor-blaze

这就是我所拥有的:

模板:

<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。值会故意返回两个不同的模板

3 个答案:

答案 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');
  }
});

在未呈现模板时自动运行渲染停止内部

答案 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