1

所以我尝试使用 Ionic 2 CLI 构建 angular-meteor WhatsApp 克隆教程

本教程基本上删除了client流星项目中的文件夹,并使用离子项目中的流星客户端包连接到流星服务器。

效果很好,但是现在我想订阅带有反应参数的流星出版物。

在搜索 Meteor API 文档后,我找到了Session对象:

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

Session 的特别之处在于它是响应式的。如果您 Session.get("currentList") 从模板内部调用,则无论何时调用该模板都会自动重新呈现  Session.set("currentList", x) 。

Meteor 订阅文档中,您可以找到以下示例:

Tracker.autorun(function () {

Meteor.subscribe("chat", {room: Session.get("current-room")});

Meteor.subscribe("privateMessages");

});

这将使您订阅当前房间中的聊天消息和您的私人消息。当你调用 Session.set("current-room", "new-room") 换房间时,Meteor 会订阅新房间的聊天消息,退订原房间的聊天消息,并继续订阅你的私信.

这正是我想做的。但正如会话文档所述,会话是我必须添加到流星项目中的一个包:

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

meteor add session

现在我的问题是,有没有办法将会话添加到流星客户端包?

如果我只是尝试调用Session.set()它在运行时失败Session is not defined

我的猜测是我需要一些 npm 包来提取会话功能(基本上是会话客户端 npm 包),例如accounts-base-client-side

还有其他方法可以做到这一点吗?我将如何构建自己的会话客户端?

我试图meteor add session在我的流星项目中运行,但无法在.meteor文件夹和npm_modules.

我还查看了流星 GitHub,但他们拥有的 Session.js 文件仅包含文档

任何输入如何做这样的事情都会很好

更新:

我查看了accounts-base-client-side包,发现它们是使用脚本自动生成的,所以我目前正在尝试调整这个脚本来使用Session而不是accounts-base。您可以在以下位置找到我的尝试:https ://github.com/AwsmOli/session-client-side

仍在进行中,但我应该尽快让它工作

更新 2:

看看我的回答,我的会话客户端现在正在工作:)

4

3 回答 3

1

根据meteor docs,您必须导入它:

import { Session } from 'meteor/session'

这将在客户端上启用它。

在早期的流星版本中,这不是必需的,因为它既是默认包,又会自动导入到全局命名空间中。

于 2016-11-18T03:04:00.477 回答
1

我最终自己创建了会话客户端包,并且它运行良好。

如果您也需要它,可以在 GitHub 上找到它: https ://github.com/AwsmOli/session-client-side

和 NPM:

npm install session-client-side

归功于idanwe,他创建了客户端软件包,并使得他的工作很容易适应任何流星软件包 :)

要将其与 Ionic 2 应用程序一起使用:

将其导入您的入口点 ( src/app/main.prod.ts& src/app/main.dev.ts)

import 'session-client-side';

现在全局 Session 变量可以在您的应用程序中的任何位置访问:

 Session.set("aCoolNameFormyAwsmChangingObject", myAwsmChangingObject); 

谢谢您的帮助!

于 2016-11-18T13:05:48.190 回答
1

“会话”变量应该刚刚出现并且可以访问。如果您需要验证这一点,请启动一个新项目,添加包并编写一些代码来访问它。很可能某些东西(不经意间)破坏了 Session 变量——我以前在另一个包中看到过这个。

另一种方法是使用“getReactively”。下面是一个在查询中使用它的助手。确保在助手之前声明它(否则它将不起作用)。这个使用另一个助手的结果,但它可以是任何变量,您只需分配变量以使反应性启动并运行助手。

this.helpers({
  currentUser: () => { return Meteor.user() },
  elder: () => {
    let e = Elders.findOne({_id: this.getReactively('this.currentUser._id')});
    if (e) {
      utils.services.setupElder(e);
    }
    return e;
  }
});
于 2016-11-17T20:15:16.590 回答