1

有没有办法订阅 Meteor Session 对象,以便在 Session 对象上设置数据时自动呈现反应式模板视图?特别是键/名称和值数据?

我有一个与迭代时渲染 Meteor Session 对象数据相关的类似问题。这个问题是故意不同的。我想以另一种方式得到答案,并且可能以更好的方式来做同样的事情。

我不想调用 Session.get('name'); 这个用例是因为我不知道 Session 对象中的名称。

所以,我希望能够在车把上放一些东西,让我能够

伪代码...

{{#each Session}}
 {{this.key}} {{this.value}}
{{/each}}
4

4 回答 4

2

不确定是否订阅会话,但对于问题的第二部分,您可以使用:

Template.hello.session = function () {
  map = []
  for (prop in Session.keys) {
    map.push({key: prop, value: Session.get(prop)})
  }
  return map
}

然后在您的模板中:

{{#each session}}
  {{key}} {{value}}
{{/each}}

不确定是否有更优雅的方式,但它有效。

于 2012-05-26T03:29:03.130 回答
2

我不这么认为。

看看https://github.com/meteor/meteor/blob/master/packages/session/session.js。它实际上相当简单。失效发生在第 45-47 行。您会看到调用Session.set会使任何人专门听该键(通过Session.get)或新值或旧值(通过Session.equals)无效。那里没有关于使整个会话无效的内容。

另一方面,考虑到它的简单程度,编写自己的数据结构来做你想做的事情并不难。我不确定您的用例是什么,但将它与会话分开可能很有意义。

于 2012-05-29T06:18:47.023 回答
1

是的,您可以订阅 Session 值。

看看自动订阅的文档:

http://docs.meteor.com/#meteor_autosubscribe

// Subscribe to the chat messages in the current room. Automatically
// update the subscription whenever the current room changes.
Meteor.autosubscribe(function () {
Meteor.subscribe("chat", {room: Session.get("current-room");});
});

此代码块显示了一种使用方法。基本上,只要“当前房间”的值发生变化,Meteor 就会更新视图。

编辑

我误解了最初的问题,并决定我需要在某种程度上赎回自己。我刚刚做了一些测试,据我所知,您目前只能订阅 collection.find() 和 session.get() 调用。所以你不能订阅整个 session 对象,甚至不能订阅 keys 对象。

但是,您可以将 Session 值设置为一个对象,这可能不是最优雅的解决方案,但这对我有用,可以通过一些骇客来跟踪密钥对象,以防止出现循环对象错误。

var mySession = {
  set: function(key, val){
    var keys = Session.keys,
        map = {};
   Session.set(key, val);

    for (var prop in keys) {
      if(!(prop === "keys")){
        map[prop] = keys[prop];
      }
    }
    Session.set('keys', map);
  }
};

这为您提供了一些看起来很像原始功能的东西,并且可以帮助您在添加或更改会话值时跟踪和更新模板。

这是我的模板助手(借用以前的答案):

Template.hello.keys = function() {
  map = [];
  keys = Session.get('keys');
  for (var prop in keys) {
    map.push({key:prop, value:keys[prop]});
  }
  return map
};

这是实际的模板:

<template name="hello">
  <div class="hello">
    {{#each keys}}
      {{key}} {{value}} <br />
    {{/each}}
  </div>
</template>

这样你就可以调用 mySession.set("thing", "another thing") 并且它会在屏幕上更新。我是 Javascript 的新手,所以如果我在这里遗漏了一些明显的东西,请告诉我,或者让我知道是否有更优雅的方式来做这件事。

于 2012-06-04T18:21:23.537 回答
0

虽然以这种方式访问​​会话对象是可行的..你不是在喝凉水。

换句话说,Meteor 在发布/订阅方面表现出色。(对我来说)在浏览器崩溃之前,您必须将多少数据放入 Session 对象中并不清楚;我宁愿不知道。

您只需将所有与会话相关的代码放在 Deps.autorun() 函数中即可插入订阅,如前面的答案中所述。任何时候会话更改都会修改订阅;您可以附加一个就绪回调,或使用 subscription.ready() 检查来启动特定操作,但理想情况下,您应该以可以使用渲染/销毁函数的方式构建模板,注意使用 {{isolate}}/ {{constant}} 尽可能。

你得到的是一种做简单事情的困难方法。并且未来可能不会坚持流星的变化;我们总是可以保证发布/订阅将按预期运行......鉴于 Session 是一个如此简单的对象......怎么说有人设计了更好的东西......它被合并到流星中;并且您会留下一些基于自定义对象的奇怪工作流程,这些对象可能不会破坏会话;但可能会影响界面的其他部分。

于 2013-12-07T17:08:20.447 回答