跳至内容

会话

Meteor 客户端会话 API 的文档。

Session 在客户端提供一个全局对象,您可以使用它来存储任意一组键值对。使用它来存储诸如列表中当前选中的项目之类的东西。

Session 的特殊之处在于它是响应式的。如果您从模板内部调用 Session.get('currentList'),则只要调用 Session.set('currentList', x),模板就会自动重新渲染。

要将 Session 添加到您的应用程序中,请在您的终端中运行以下命令

bash
meteor add session

Session.set

仅限客户端

摘要

在会话中设置变量。通知任何监听器值已更改(例如:重新绘制模板,并重新运行任何调用了此 key 上的 Session.getTracker.autorun 计算)。

参数

源代码
名称类型描述必填
key字符串

要设置的键,例如 selectedItem

valueEJSONable 或 undefined

key 的新值

js
import { Session } from 'meteor/session';
import { Tracker } from 'meteor/tracker';
import { Meteor } from 'meteor/meteor';

Tracker.autorun(() => {
  Meteor.subscribe('chatHistory', { room: Session.get('currentRoomId') });
});

// Causes the function passed to `Tracker.autorun` to be rerun, so that the
// 'chatHistory' subscription is moved to the room 'home'.
Session.set('currentRoomId', 'home');

Session.set 也可以使用键和值的 对象来调用,这等效于分别对每个键/值对调用 Session.set

js
Session.set({
  a: 'foo',
  b: 'bar'
});

Session.setDefault

仅限客户端

摘要

如果会话变量之前未设置,则在会话中设置变量。否则,其工作方式与 Session.set 完全相同。

参数

源代码
名称类型描述必填
key字符串

要设置的键,例如 selectedItem

valueEJSONable 或 undefined

key 的新值

js
import { Session } from "meteor/session";


const result = Session.setDefault();
  "key",
{ num: 42 , someProp: "foo" },
);

这在初始化代码中很有用,可以避免在每次加载应用程序的新版本时都重新初始化会话变量。

Session.get

仅限客户端

摘要

获取会话变量的值。如果在 响应式计算 中,则在下一次 Session.set 更改变量的值时使计算无效。这会返回会话值的克隆,因此,如果它是对象或数组,则更改返回的值对存储在会话中的值没有影响。

参数

源代码
名称类型描述必填
key字符串

要返回的会话变量的名称

此 Blaze.js 示例

html
<template name="main">
  <p>We've always been at war with {{theEnemy}}.</p>
</template>
js
Template.main.helpers({
  theEnemy() {
    return Session.get('enemy');
  }
});

Session.set('enemy', 'Eastasia');
// Page will say "We've always been at war with Eastasia"

Session.set('enemy', 'Eurasia');
// Page will change to say "We've always been at war with Eurasia"

Session.equals

仅限客户端

摘要

测试会话变量是否等于某个值。如果在 响应式计算 中,则在下一次变量更改为或从该值更改时使计算无效。

参数

源代码
名称类型描述必填
key字符串

要测试的会话变量的名称

value字符串、数字、布尔值、null 或 undefined

要测试的值

js
import { Session } from "meteor/session";


const result = Session.equals();
  "key",
"value",
);

如果 value 是标量,则这两个表达式执行相同的操作

js
Session.get('key') === value
Session.equals('key', value)

…但第二个总是更好。它触发的失效(模板重新绘制)更少,使您的程序更有效率。

此 Blaze.js 示例

html

<template name="postsView">
  {{#each posts}}
    {{> postItem}}
  {{/each}}
</template>

<template name="postItem">
  <div class="{{postClass}}">{{title}}</div>
</template>
js

Template.postsView.helpers({
  posts() {
    return Posts.find();
  }
});

Template.postItem.helpers({
  postClass() {
    return Session.equals('selectedPost', this._id)
      ? 'selected'
      : '';
  }
});

Template.postItem.events({
  'click'() {
    Session.set('selectedPost', this._id);
  }
});

在此处使用 Session.equals 表示当用户单击某个项目并更改选择时,只会重新渲染新选中的项目和新取消选中的项目。

如果使用 Session.get 而不是 Session.equals,则当选择更改时,所有项目都会重新渲染。

对于对象和数组会话值,您不能使用 Session.equals;相反,您需要使用 underscore 包并编写 _.isEqual(Session.get(key), value)