1

データが Session オブジェクトに .set されているときにリアクティブなテンプレート ビューが自動的にレンダリングされるように、Meteor Session オブジェクトをサブスクライブする方法はありますか? 具体的には、キー/名前と値のデータ?

繰り返し処理されたときの Meteor セッション オブジェクト データのレンダリングに関連する同様の質問があります。この質問は特に意図的に異なります。別の方法で、おそらく同じことを行うためのより良い方法で回答を得たいと思います。

Session.get('name'); を呼び出す必要はありません。この使用例は、Session オブジェクト内の名前がわからないためです。

だから、私はハンドルバーに何かを持たせたいと思っています。

擬似コード...

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

4 に答える 4

2

私はそうは思わない。

https://github.com/meteor/meteor/blob/master/packages/session/session.jsをご覧ください。それは実際にはかなり単純です。無効化は45〜47行目で発生します。呼び出すと、そのキーを具体的に(via )または新しい値または古い値(via )Session.setを聞いている人が無効になります。セッション全体を無効にすることについては何もありません。Session.getSession.equals

一方、それがいかに単純であるかを考えると、あなたが望むことを行う独自のデータ構造を書くことはそれほど難しいことではありません。あなたのユースケースが何であるかはわかりませんが、それをセッションから分離することは非常に理にかなっているかもしれません。

于 2012-05-29T06:18:47.023 に答える
2

セッションへのサブスクライブについては不明ですが、質問の 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 に答える
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");});
});

このコード ブロックは、これを使用する 1 つの方法を示しています。基本的に、"current-room" の値が変更されるたびに、Meteor はビューを更新します。

編集

私は最初の質問を誤解し、自分自身をいくらか償う必要があると判断しました. いくつかのテストを行ったところ、現在のところ、collection.find() および session.get() 呼び出しのみをサブスクライブできることがわかります。そのため、セッション オブジェクト全体やキー オブジェクトをサブスクライブすることはできません。

ただし、オブジェクトにセッション値を設定することはできますが、これは最も洗練された解決策ではないかもしれませんが、循環オブジェクト エラーが発生しないようにするためのいくつかのハッカーでキー オブジェクトを追跡するのに役立ちました。

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() 関数に入れるだけです。セッションが変更されるたびに、サブスクリプションが変更されます。Ready コールバックをアタッチするか、subscription.ready() チェックを使用して特定のアクションを開始できますが、理想的には、{{isolate}}/ を使用するように注意して、レンダリング/破棄された関数を使用できるようにテンプレートを構成します{{constant}} 可能な場合。

あなたが得ているのは、単純なことをするのが難しい方法です。将来の流星の変化に固執しない可能性があります。パブリッシュ/サブスクライブが期待どおりに機能することは常に保証できます...セッションが非常に単純なオブジェクトであることを考えると..誰かがすぐにより良いものを設計すると言います..そしてそれは流星にマージされます。そして、セッションを壊さないかもしれないカスタムオブジェクトに基づくいくつかの奇妙なワークフローが残っています; ただし、インターフェイスの他の部分に影響を与える可能性があります。

于 2013-12-07T17:08:20.447 に答える