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

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

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

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

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

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

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

【问题讨论】:

    标签: meteor meteor-methods optimistic-ui


    【解决方案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
    猜你喜欢
    • 2015-10-28
    • 2017-11-02
    • 1970-01-01
    • 2018-11-21
    • 2015-04-03
    • 1970-01-01
    • 2015-03-15
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多