2013-10-18 82 views
1

我們結合了數據訪問方面的要求。Ember數據同步 - LocalStorage + REST + RealTime +在線/離線

  • 預加載一些reference數據。
  • 我們需要參考數據來保持瀏覽器重新啓動,而不是僅僅停留在內存中以避免一直加載。我目前正在使用LocalStorageAdapter
  • 一旦我們拿到它,我們想sync changes(輪詢或使用背景Socket.IO和更新的localStorage可以做的伎倆)
  • 還有一些其他的模型,更事務性的,在這裏我們就需要直接去到服務器並獲取/保存它們。這將是很好的使用像RESTAdapter的。
  • 最後,有些操作應該可以工作off-line,並且稍後應該同步更改。

爲了使它更具體:

  • 我們pre-load供應商和 「最喜愛的產品」 到本地存儲。我們與這些人脫機工作。
  • 我們需要將服務器更改同步到供應商和產品信息。
  • 如果他們搜索完整的目錄,那就要求他們在線。
  • 離線時,我們需要允許用戶添加一些東西到他們的購物車,甚至提交和訂購。我們希望排列此行動並在他們擁有互聯網連接時提交。

所以有幾個問題都源於此:

  • 有沒有辦法對用戶RESTAdapter與localStorage的組合?
  • 是否支持一些Socket.IO? (手動做這個部分很高興)
  • 有排隊支持嗎?理想情況下在Ember-Data級別。

我知道我們必須手動完成很多工作,並將不同的樂高組合在一起,但我想從Ember devs的經驗中尋求一些觀點。

回答

1

你絕對可以做到這一點。就像你說的那樣,你需要做很多樂高玩具才能把它放在一起。

您需要採用RESTAdapter和LSAdapter並創建一個混合。在我的工作中,我們做了一些類似的工作,但它只有一種方式(從服務器到客戶端,而不是反向)。

話雖這麼說,我只是想提出幾個問題:

  1. 多少錢你打算在localStorage的存儲和你有到位的搬遷計劃?對於大多數瀏覽器來說,本地存儲通常很小,但大多數瀏覽器的實現是相同的(直到IE8才實現)。 IndexedDB爲您提供了更大的空間,儘管實施在IE的更高版本之前不可用。

  2. 根據性能需求,我建議首先存儲localStorage,然後嘗試持久保存到服務器,如果它從localStorage彈出,如果它沒有留在那裏讓適配器嘗試以後嘗試日期。 (我會考慮使用Ember的時間表或scheduleOnce或其他方便的助手在運行循環中工作,http://emberjs.com/api/classes/Ember.run.html#method_schedule)。

    Called by the store when a newly created record is 
    `save`d. 
    
    It serializes the record, and `POST`s it to a URL generated by `buildURL`. 
    
    See `serialize` for information on how to customize the serialized form 
    of a record. 
    
    createRecord: function(store, type, record) { 
    
    var data = {}; 
    var serializer = store.serializerFor(type.typeKey); 
    
    serializer.serializeIntoHash(data, type, record, { includeId: true }); 
    // build up a model that knows the url, the method, and the data to post 
    // store it to local storage in some queue to save 
    // schedule it to save to server later, keep track of the record since you'll 
    // need to update the record with new information later that could come down 
    // from the server 
    return this.ajax(this.buildURL(type.typeKey), "POST", { data: data }); 
    }, 
    

老實說,我認爲你可能會遇到的最困難的事情會如何處理IDS時,你真的不將其保存到服務器。祝你好運

+0

謝謝。這很有用。關於'IDs'因爲客戶端正在處理一個較小的域名,所以我打算轉移到GUID或者在服務器和客戶端之間使用不同的ID。我們沒有很多數據存儲在localStorage中的數據少於200KB,因此我不會看到這種增長。我們不必擔心IE :) –

+0

你可以擴展如何RESTAdapter和LSAdapter混合工作?爲什麼只有一種方式?你是否也做過其他事情來支持脫機功能,或者只是保存到LocalStorage並稍後重試? –

+0

這是一種方式,它只在本地存儲中存儲記錄,而不是保存。未來的提取會觸及本地存儲,如果它存在的話,它會使用它,如果沒有的話它會去服務器https://github.com/emberjs/data/blob/master/TRANSITION.md – Kingpin2k