2017-01-25 217 views
0

這從待辦事項列表教程片段之間的通信。變量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

流星喜歡模糊客戶端和服務器之間的界限。有些東西可以用來抽象代碼 - 例如,/server目錄中的javascript文件(包括所有文件)以限制對其的訪問。這意味着客戶端用戶無法看到此代碼。

/client顯然是相反的。您可以使用isClientisServer檢查文件。

現在,這是什麼意思你的代碼?

根據您的代碼,也有不同的訪問級別。但是,在腳本內部,基本沒有區別。 checked在該腳本中的服務器/客戶端上是已知的,因爲這就是Meteor運行的方式,客戶端和服務器之間的模糊線路使這成爲可能。

流星採用了名爲「數據庫無處不在」,這意味着它並不重要,其中的代碼被調用,因爲它會運行。

0

checkedTasks對象上定義一個attrubite,如在此應用中所定義。

在Meteor中,此對象的最終記錄存儲在服務器上(位於MongoDB),但是此處也有一個客戶端緩存,此處也稱爲MiniMongo。 Meteor框架在後臺做了很多工作(通過DDP協議),以保持服務器和客戶端的對象保持同步。

在這種情況下,下面當用戶點擊複選框在Tasks.update方法(焙燒'click .toggle-checked'事件代碼)正在發生的事情:

  1. 首先更新客戶端側MiniMongo緩存 - 這被稱爲Optimistic UI,和使客戶端UI能夠快速響應(無需等待服務器)
  2. 通過將clicked變量設置爲新值,向服務器發送消息(Meteor Method),表明客戶端想要更新Tasks對象。
  3. 消息請求更新通過服務器接收,檢查這是一個有效的操作,並且或者對其進行處理(更新MongoDB版本Tasks對象的,或拒絕處理更新爲適當。
  4. 服務器將發出一個DDP更新的Tasks對象到所有客戶端所產生的狀態已經預訂,包括它的發佈。先前已訂閱將收到此DDP更新
  5. 客戶,並將與服務器的的Tasks對象的版本替換其MiniMongo版本,確保所有客戶端與服務器同步

現在,在理想的情況下,當服務器接受客戶端的變化,Tasks接收到的新版本(在步驟5)由所述發起客戶端將匹配它樂觀地更新該對象(步驟1)。

但是通過實施這些步驟的流星框架也同步其他客戶端,並在服務器拒絕更新,或可能修改其他字段,以適合的應用程序處理的情況。

幸運的是,雖然,這是全部由流星框架處理,所有你需要做的就是調用Tasks.update這一切神奇的發生!