有没有办法订阅Meteor Session对象,以便当Session对象上的数据为.set时,反应模板视图会自动呈现?特别是键/名称和值数据?
我有一个类似的问题与迭代时渲染Meteor Session对象数据有关。这个问题在目的上有明显的不同。我希望以另一种方式得到答案,并且可能更好地做同样的事情。
我不想调用Session.get('name');这个用例是因为我不知道Session对象中的名称。
所以,我希望能够在车把上放一些能让我
的东西Psuedo代码......
{{#each Session}}
{{this.key}} {{this.value}}
{{/each}}
答案 0 :(得分: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}}
不确定是否有更优雅的方式,但它有效。
答案 1 :(得分:2)
我不这么认为。
看看https://github.com/meteor/meteor/blob/master/packages/session/session.js。它实际上相当简单。失效发生在第45-47行。您会看到调用Session.set
会使听取该密钥的任何人(通过Session.get
)或新值或旧值(通过Session.equals
)无效。没有任何关于整个会话无效的内容。
另一方面,考虑到它是多么简单,编写自己想做的数据结构并不是很难。我不确定你的用例是什么,但将它与会话分开可能会很有意义。
答案 2 :(得分:1)
是的,您可以订阅会话值。
查看自动订阅的文档:
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()调用。因此,您无法订阅整个会话对象,甚至订阅密钥对象。
但是,您可以将一个会话值设置为一个对象,这可能不是最优雅的解决方案,但这对我来说跟踪了一些hackery以防止出现循环对象错误。
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”,“另一件事”),它会在屏幕上更新。我是Javascript的新手,所以有人请告诉我,如果我在这里遗漏了一些明显的东西,或者让我知道是否有更优雅的方式。
答案 3 :(得分:0)
虽然以这种方式访问会话对象是可行的.. 你没有喝冷饮。
换句话说,Meteor在发布/订阅方面表现出色。我不清楚(对我来说)在浏览器崩溃之前你需要在Session对象中放入多少数据;我宁愿不知道。
您只需将所有与会话相关的代码放入Deps.autorun()函数中即可插入订阅,如前面的答案中所述。每次会话更改时,它都会修改订阅;你可以附加一个现成的回调函数,或使用subscription.ready()检查来启动特定的操作,但理想情况下你可以使用渲染/销毁函数的方式构建模板,注意使用{{isolate}} / {{constant}},如果可能的话。
你所得到的是一种简单易行的方法;并且未来可能不会坚持流星的变化;我们总能确保发布/订阅将按预期运行...鉴于Session是一个如此简单的对象..什么时候说有人设计好一些东西......它会被合并到流星中;并且你会得到一些奇怪的工作流程,这些工作流程基于可能不会破坏Session的自定义对象;但可能会影响界面的其他部分。