.findAll
緩存:
第一次store.find被調用時,獲取新的數據
下一次返回緩存的數據
在後臺獲取新的數據和更新
這是新的findRecord和findAll方法的行爲。
正如你可以在Ember Data v1.13 blog post中看到的。
所以,把你的例子:
var posts = this.store.findAll('post'); // => GET /posts
// /\ or load from cache and update data in background /\
var posts = this.store.peekAll('post'); // => no network request
和:
在我看來,我總是首先需要做的findAll但不 明確爲我的理解時,我應該做一個peekAll。
是的,你需要做的第一.findAll
,但我們鼓勵你在所有地方使用.findAll
,因爲它是高速緩存,並且適合於數據的多個請求(來自全國各地的應用很多地方不浪費帶寬)。
例如,用戶進入我的博客,然後我使用的findAll,然後在相同的流量,我需要所有這些 後某一時刻得到的所有帖子 ,所以我應該使用peekAll以節省帶寬。那麼我應該如何知道我以前請求過所有帖子?我應該保存一些 全局狀態來處理?我會假設第一次 客戶端請求一個peekAll如果沒有任何記錄它會自動做一個findAll或者我應該手動,但它可能會引入一些樣板。
我認爲用戶需要在應用程序中始終使用最新的數據。如果您在瀏覽頁面時添加博客文章,該怎麼辦?如果您使用.peekAll()
,則用戶需要刷新頁面以獲取最新數據。
如果你想節省帶寬,那麼我建議你在Ember Adapter中實現一些額外的邏輯,但你必須找到平衡用戶請求和需要始終提供最新數據的方法。您可以通過覆蓋適配器的方法來做到這一點:
shouldReloadAll: function(store, snapshotRecordArray)
shouldBackgroundReloadAll: function(store, snapshotRecordArray)
請參閱more info about these methods in Ember API docs。
你如何在實踐中使用findAll和peekAll或它們的等價物爲 單條記錄?任何建議?
如果您完全確定在首次請求後您始終擁有最新數據,請使用.peekAll
。數據可以始終保持最新,因爲例如它幾乎不會在數據庫中發生變化。這取決於您的需求以及您是如何設計數據模型的。很難找到好的例子,但也許想象一下,如果你有一些模型只包含常量。像PI
值等。也許你已經從某個地方導入它,它是完整的,封閉的東西永遠不會改變。然後,在第一個.findAll
(例如,如果它是您的應用程序的核心功能,它可以在Application
路線beforeModel
鉤子中定義),您可以確定不再需要任何請求,並且您擁有所有數據。
如果您的應用程序具有離線模式之類的功能,並且只能依賴您已擁有的數據,則還可以使用.peekAll
。
出色的是,我的缺失部分是:「或從緩存中加載並更新後臺數據」。這很有道理。謝謝 –