2015-09-02 57 views
3

EmberJS documentation我得到以下兩種方式來檢索給定類型的所有記錄,一種發出請求,另一種不發出請求。你如何在實踐中使用findAll和peekAll在Ember中?

var posts = this.store.findAll('post'); // => GET /posts

var posts = this.store.peekAll('post'); // => no network request

在我看來,我總是需要先做一個findAll但是當我應該做一個peekAll尚未暢通,我的理解。

例如,用戶進入我的博客,然後我用findAll讓所有的帖子,然後在相同的流量,我需要所有這些後的某一點,所以我應該使用一個peekAll以節省帶寬。那麼我應該如何知道我以前請求過所有的posts?我應該保存一些全局狀態來處理這個問題嗎? 我會假設客戶第一次請求peekAll如果沒有任何記錄它會自動做findAll或者我應該手動但它可能會引入一些樣板。

你如何在實踐中使用findAllpeekAll或他們等同於單個記錄?任何建議?

回答

8

.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

+2

出色的是,我的缺失部分是:「或從緩存中加載並更新後臺數據」。這很有道理。謝謝 –

相關問題