【问题标题】:Can I subscribe to Meteor Session for reactive template render updates?我可以订阅 Meteor Session 以获取响应式模板渲染更新吗?
【发布时间】:2012-06-01 09:56:25
【问题描述】:

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

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

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

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

伪代码...

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

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

    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}}
    

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

    【讨论】:

      【解决方案2】:

      我不这么认为。

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

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

      【讨论】:

        【解决方案3】:

        是的,您可以订阅 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 新手,所以如果我在这里遗漏了一些明显的东西,请告诉我,或者让我知道是否有更优雅的方法。

        【讨论】:

        • 问题是关于整个 Meteor 会话,而不仅仅是一个值。
        • 是的,你是对的。我在这方面的阅读理解失败了。
        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-15
          • 2015-06-22
          • 2019-04-15
          • 1970-01-01
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多