流星,客户端和服务器之间的通信

时间:2017-01-25 20:35:24

标签: javascript meteor

这是todo列表教程的片段。变量checked在客户端和服务器端都有表示?客户端和服务器如何通信以使checked保持一致?

Template.task.events({
  'click .toggle-checked'() {
    // Set the checked property to the opposite of its current value
    Tasks.update(this._id, {
      $set: { checked: ! this.checked },
    });                                                                                                              
  },
  'click .delete'() {
    Tasks.remove(this._id);
  },
});

2 个答案:

答案 0 :(得分:0)

checked是在Tasks对象上定义的attrubite,如此应用中所定义。

在Meteor中,此对象的最终记录存储在服务器上(在MongoDB中),但是此处还有一个客户端缓存,也称为MiniMongo。 Meteor框架在后台(通过DDP协议)完成了大量工作,以使服务器和客户端对象保持同步。

在这种情况下,当用户点击'click .toggle-checked'方法中的复选框(触发Tasks.update事件代码)时,会发生以下情况:

  1. 首先更新客户端MiniMongo Cache - 这称为Optimistic UI,并使客户端UI能够快速响应(无需等待服务器)
  2. 通过将Meteor Method变量设置为新值,向客户端要更新Tasks对象的服务器(clicked)发送消息。
  3. 请求服务器收到更新的消息,它检查这是一个有效的操作,并处理它(更新MongoDB对象的Tasks版本,或拒绝处理更新。
  4. 服务器将向已订阅包含该文件的出版物的所有客户发送DDP Tasks对象生成状态的DDP更新。
  5. 之前已订阅的客户端将收到此MiniMongo更新,并将使用服务器版本的Tasks对象替换其Tasks版本,以确保所有客户端与服务器
  6. 现在在理想情况下,当服务器接受客户端更改时,发起客户端收到的新版本Tasks.update(在步骤5中)将匹配它乐观更新的对象(在步骤1中)。

    但是,通过实施所有这些步骤,Meteor框架还会同步其他客户端,并在服务器拒绝更新时处理这种情况,或者可能根据应用程序修改其他字段。

    幸运的是,这一切都是由Meteor框架处理的,所有你需要做的就是调用Option Explicit Sub Execute() ' ' Execute Macro ' ' Dim pricewithdollar As String Dim pricewithoutdollar As String Dim price As Double Dim qty As Double Dim weight As Double Dim i As Integer Dim Amount As Double pricewithdollar = ActiveDocument.Tables(1).Cell(8, 9).Range.Text pricewithoutdollar = Replace(pricewithdollar, "$", "") price = Val(pricewithoutdollar) qty = Val(ActiveDocument.Tables(1).Cell(8, 1).Range.Text) weight = Val(ActiveDocument.Tables(1).Cell(8, 6).Range.Text) Amount = price * qty * weight ActiveDocument.Tables(1).Cell(8, 10).Range.Text = Format(Amount, "Currency") For i = 9 To 30 pricewithdollar = ActiveDocument.Tables(1).Cell(i, 10).Range.Text price = Val(pricewithoutdollar) Amount = Amount + price Next i pricewithdollar = ActiveDocument.Tables(1).Cell(32, 3).Range.Text pricewithoutdollar = Replace(pricewithdollar, "$", "") price = Val(pricewithoutdollar) Amount = Amount + price ActiveDocument.Tables(1).Cell(33, 3).Range.Text = Format(Amount, "Currency") End Sub 来实现所有这些魔法!

答案 1 :(得分:-2)

流星喜欢模糊客户端和服务器之间的界限。您可以采取一些措施来抽象代码 - 例如,/server目录中的javascript文件(在所有文件中)以限制对它的访问。这意味着客户端用户无法看到此代码。

/client显然恰恰相反。您可以使用isClientisServer检查文件。

现在,这对您的代码意味着什么?

根据代码的位置,有不同的访问级别。但是,在脚本里面,基本没有区别。 checked在该脚本内的服务器/客户端上是已知的,因为这是Meteor运行的方式,客户端和服务器之间的模糊线使这成为可能。

Meteor采用了一种名为“无处不在的数据库”的东西,这意味着调用代码的位置并不重要,因为它会运行。