【问题标题】:Meteor Reactive Session: Not Working (Why?)Meteor Reactive Session:不工作(为什么?)
【发布时间】:2026-01-19 21:45:01
【问题描述】:

我在使用 Meteor.js 中的反应式会话时遇到问题。

演示:Meteor Pad

Template.rows.helpers({
  'rows': function () {
     return Session.get('rows'); // data set in Session
  }
});

Template.count.events({
  'click .mdl-radio__button': function (e) {
    // target represents a number of selected rows (1, 2, 5, or 10)
    var value = $(e.currentTarget).val();
    Session.set('limit', value);
  },
  'click #reset': function () {
    Session.set('limit', 0);
    Session.set('rows', null);
  },
  'click #run': function () {
    // should only get rows when run() is pressed
    Session.set('rows', currentItems);
  }
});

用户应该能够选择要接收的新集合数量,由限制控制。但是,我不断收到以下错误:

Error: Match error: Failed Match.OneOf or Match.Optional validation

任何想法为什么?有人可以给我看一个可以运行的 MeteorPad 演示吗?

【问题讨论】:

    标签: meteor meteor-blaze


    【解决方案1】:

    我的流星垫有问题。但你的问题不是Session。问题是您对Tracker.autorun 的使用。你应该阅读docs on that

    您假设 Tracker.autorun(getItems) 返回 getItems 返回的内容。情况并非如此。您需要在autorun 中设置currentItems(在您的情况下为getItems)。

    getItems = function () {
      if (Session.get('limit') > 0) {
        currentItems = Items
          .find({}, {limit: Session.get('limit')})
          .map(function (item, index) {
            item.index = index + 1;
            return item;
          });
      } else {
        currentItems = null;
      }
    };
    

    【讨论】:

    • 感谢您的帮助。不幸的是,我仍然收到同样的错误。奇怪的是,如果我调用Items.find({}, {limit: 10}) 它可以工作,但如果只是在上面我设置var limit = 10; Items.find({}, {limit: limit}) 它会失败。任何带有集合调用的变量都会导致它失败。知道为什么吗?
    • @shmck 这不可能是它失败的原因。必须是limit的内容。
    • 在上面发布了解决方案。我不知道 Session 对数字进行字符串化。
    【解决方案2】:

    终于明白了。显然 Session 创建了一个字符串,因此Session.set('limit', 1) 将限制设置为"1"。当然,可以在 Mongo 集合请求中处理字符串。

    解决方案是使用{limit: parseInt(Session.get('limit')}

    【讨论】: