Meteor,如何使用乐观的 UI 更新集合

Posted

技术标签:

【中文标题】Meteor,如何使用乐观的 UI 更新集合【英文标题】:Meteor, how to update collection with optimistic UI 【发布时间】:2016-06-27 02:59:12 【问题描述】:

在我的应用程序中,我将方法放置在客户端和服务器之间的共享位置。这种方式正如meteor docs中所建议的那样,方法机制负责乐观的UI。

但我刚刚在 David Weldon blog 中读到了关于两层实现的内容,这对我来说很有意义。

问题是如何通过两层实现实现乐观 UI。

    将方法移动到服务器,在模板事件中更新 clientDB 以实现乐观 UI,并拒绝所有从客户端到 DB 的更新。

    有什么方法可以在客户端使用,但只能从另一个方法调用?

我们将不胜感激任何建议的方法。

【问题讨论】:

【参考方案1】:

我认为重要的是拒绝客户端插入/更新。完成后,您可以从客户端运行第二层代码,它实际上不会做任何事情,因为它会被拒绝。

以下是来自https://www.discovermeteor.com/blog/meteor-pattern-two-tiered-methods/ 的几段支持该观点的段落:

客户端和服务器

虽然我说过 postSubmit 函数主要希望在服务器上运行,但它会在两种情况下运行在客户端上。

首先,当从 postSubmit 方法调用时,作为该方法的客户端模拟的一部分。在这种情况下,Meteor 将执行模拟,将 post 插入客户端数据库,然后最终触发服务器端 postSubmit 方法调用。

另一个用例是有人直接从浏览器控制台调用 postSubmit 函数。如果发生这种情况,Posts.insert() 调用将失败,因为我们不允许客户端插入,并且不会发生任何事情。

请注意,允许/拒绝不会影响从 Meteor 方法中执行的代码,这就是即使您没有声明允许/拒绝策略,模拟也不会失败的原因。

换句话说,答案#1:将方法保存在一个公共位置并删除不安全的包(meteor remove insecure)

对#2 的回答:是否在方法之外调用它们并不重要,因为它们会被拒绝。

【讨论】:

好吧,Sacha 所做的是将写入 DB 方法移至仅服务器层。客户端无法访问该方法并被拒绝。在该方法中,他检查了一些条件,如果客户无权访问,他们会立即得到错误。但它不是乐观的 UI,因为写入只发生在服务器中,客户端必须等待服务器的响应,他试图通过延迟回调来加速它,但仍然不是乐观的 UI。 你不需要这样做。 “第二层”功能应该保留在共享代码中,以便客户端和服务器都可以访问它。如果客户端通过 Meteor.call(即方法)调用它,那么第二层函数在流星的模拟下运行,并且插入将发生在客户端数据上(这就是您所追求的乐观 UI)。如果服务器随后运行它并被拒绝,则插入将在客户端回滚。如果它在方法调用之外运行(例如通过控制台),则根本不允许插入(在运行“meteor remove insecure”之后) 但是这样第二层方法可以直接从客户端调用,无需第一方法验证! David Weldon 在我的回答中引用了这种情况:“如果发生这种情况,Posts.insert() 调用将失败,因为我们不允许客户端插入,并且什么也不会发生。 " 啊,明白了——第二层不在方法内——它必须在方法外。阅读上面链接的文章,特别是“submitPost 函数”下的部分,他解释了具有非方法函数的原因。 discovermeteor.com/blog/meteor-pattern-two-tiered-methods

以上是关于Meteor,如何使用乐观的 UI 更新集合的主要内容,如果未能解决你的问题,请参考以下文章

如何部分更新meteor.users.profile?

当我们从 Mongo 控制台更新集合时,Meteor Apollo 没有更新 UI

Meteor:我应该如何更新用户集合以在对象/字典中包含一个新属性?

如何更新meteor.js中的Mongodb集合?

如何在 react-admin 中禁用乐观 UI 更新?

Meteor JS如何从集合中的数组中获取特定对象?