簡體   English   中英

通知余燼數據有關服務器的更改

[英]Inform ember-data about server changes

我目前正在計划在Rails和ember.js上使用ruby的復雜應用程序。 到目前為止,我對ember-data的了解是它會自動緩存記錄。 post.comments首先將導致Ajax調用,以獲取給定帖子的所有評論,但是如果用戶下次訪問相同的路線,則只會從商店緩存中獲取記錄。

問題是:如果其他用戶對此帖子添加評論怎么辦? 如何告訴ember由於發生了某些更改,它必須重新加載其緩存?

我已經考慮過使用websockets告訴客戶要重新加載哪些內容的解決方案-但我認為這不是最佳實踐。 另外,我無法想象這不是一個普遍的問題,所以我想知道其他開發人員正在做什么來解決這個問題。

我試圖在(實驗)聊天應用程序中實現模型更新。 我在服務器端使用了SSEActionController::Live (Ruby on Rails),在客戶端使用了EventSource

簡化代碼:

App.MessagesRoute = Ember.Route.extend({
  activate: function() {
    if (! this.eventSource) {
      this.eventSource = new EventSource('/messages/events');

      var self = this;
      this.eventSource.addEventListener('message', function(e) {
        var data = $.parseJSON(e.data);
        if (data.id != self.controllerFor('messages').get('savedId')) {
          self.store.createRecord('message', data);
        }
      });
    }
  }
});

App.MessagesController = Ember.ArrayController.extend({
  actions: {
    create: function() {
      var data = this.getProperties('body');
      var message = this.store.createRecord('message', data);
      var self = this;
      message.save().then(function (response) {
        self.set('savedId', response.id);
      });
    }
  }
});

邏輯很簡單:我從EventSource獲取每條新記錄。 然后,如果記錄是由另一個客戶端創建的,則應用程序會檢測到該記錄,並使用ember-datacreateRecord將新記錄添加到存儲中。 假設此邏輯可能有一些警告,但至少它可以很好地用作“概念證明”。 聊天正在進行。

完整資源可在這里找到: https//github.com/denispeplin/ember-chat/

關於重新加載,我有話要說:您可能不想執行完全重新加載,這是耗資源的操作。 盡管如此,您的客戶端仍需要某種方式來了解新記錄。 因此,通過SSE一張一張地獲取新記錄可能是最好的選擇。

如果您只想擺脫緩存,則可以在用戶每次導航到注釋route時強制重新加載 但這很大程度上取決於您要實現的目標,我希望comments只是一個例子。

如果您希望ui隨服務器的更改自動更新,則需要與服務器進行一些通信,需要一些輪詢機制,例如websocket或從webworker輪詢。 然后,您可以reload從服務器發送的已更改記錄的列表。 您可能正朝着正確的方向前進。

您還可以查看與Ember很好集成的orbitjs獨立庫。 如果您還需要本地存儲並必須管理多個數據源,則此功能將更為有用。

無論您使用什么框架,這實際上都是任何Web應用程序都常見的問題。 從我的角度來看,有兩個主要選項。 一個:您有一項服務可輪詢服務器以檢查是否有任何更改需要您重新加載某些模型,讓該服務返回這些模型ID並刷新它們,從而使該服務生效。 根據您的建議,另一個選項是使用網絡套接字並推送模型更改/新模型本身的通知。

我實際上選擇僅發送評論模型本身,並將其推入Ember商店和關聯的post對象。 這將減少對您的模型進行硬刷新的情況下訪問服務器的需求。 我目前在Ember應用程序中使用此方法,其中有一個對象包含基於我應用程序中所有模型的概述數據,並且在后端進行更改時,我的Websocket服務器將新的概述數據推送到我的應用程序中。

更新::我的意思是說這不是評論,而是好。

我在移動應用程序開發中遇到了同樣的問題。 雖然websockets似乎是第一個答案,但我擔心服務器資源有限的可伸縮性問題。 我決定堅持使用Ajax調用來獲取新修改的記錄。 這樣,僅當用戶處於活動狀態時才使用服務器資源。 但是,正如其他人指出的那樣,每次需要數據時都返回所有注釋會使緩存變得無用且緩慢。 我建議更新您的Rails服務器以接受可選的時間戳。 如果未提供時間戳,則將檢索每個注釋。 如果提供了時間戳,則僅返回updated_at>=提供的時間戳的注釋。 這樣,如果自上次通話以來未添加或修改任何注釋,那么您會迅速返回一個空列表並繼續前進。 如果返回結果,則可以將其與現有列表合並並顯示更新的注釋。

獲取新創建或修改的注釋的示例

if params.has_key?(:updated_since)
  comments = Post.find(params[:id]).comments.where("updated_at >= ?", params[:updated_since])
else
  comments = Post.find(params[:id]).comments
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM