Meteor,如何使用乐观用户界面更新集合

Meteor,如何使用乐观用户界面更新集合,meteor,meteor-methods,optimistic-ui,Meteor,Meteor Methods,Optimistic Ui,在我的应用程序中,我将这些方法放置在客户端和服务器之间的共享位置。正如meteor中所建议的那样,方法机制负责乐观的UI 但我刚刚在David Weldon的文章中读到了关于两层实现的内容,这对我来说很有意义 问题是如何通过两层实现实现乐观UI 将方法移动到服务器,在乐观UI的模板事件中更新clientDB,并拒绝从客户端到DB的所有更新 有没有办法让方法在客户端可用,但只能从另一个方法调用 任何建议的方法都将受到欢迎。我认为重要的是拒绝客户端插入/更新。一旦这样做了,您就可以从客户端运行第二层

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

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

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

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

  • 有没有办法让方法在客户端可用,但只能从另一个方法调用


  • 任何建议的方法都将受到欢迎。

    我认为重要的是拒绝客户端插入/更新。一旦这样做了,您就可以从客户端运行第二层代码,而它实际上不会做任何事情,因为它将被拒绝

    以下是支持这一观点的几段文字:

    客户机和服务器

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

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

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

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

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


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

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