2017-04-13 52 views
4

我一直在學習角2幾個星期。我有一點困惑。請比較的數據是如何存儲/這裏分享:Angular 2服務:在哪裏保存數據

https://github.com/Apress/pro-angular-2ed/blob/master/Angular%202.0/08%20-%20SportsStore%20-%20Orders%20and%20Checkout/SportsStore/app/model/product.repository.ts

這裏:

https://github.com/gothinkster/angular2-realworld-example-app/blob/master/src/app/shared/services/comments.service.ts

第一個鏈接顯示它是如何在亞當·弗里曼的書叫「臨角」來完成。我們可以看到有一個名爲ProductRepository的服務,這就是所有產品都存儲的地方。這個服務有一個構造函數,它從另一個服務初始化它的數據,名爲StaticDataSource(稍後在本書中更改爲從其餘api獲取數據)。所以總結一下:我們有一個組件,它被注入了一個名爲ProductRepository的服務。然後它使用該服務中的getProducts()方法來接收所有產品(實際上這些產品只存儲在該服務的數組中)。

現在讓我們看一下第二個環節:

在這裏,我們有一個CommentsService。這次數據不存儲在這個服務中。我們只需要調用getComments()方法,然後再執行api服務中的另一種方法。 所以總結一下:我們有一個組件(ArticleComponent),它被注入了CommentsService。然後它調用該服務的getComments(),實際上每次調用時都會向服務器發送一個http.get請求。


現在我的問題是關於這些方法和後果之間的差異。根據我的理解,在第一種情況下,所有數據都從服務器獲取一次(應用程序加載時),然後將其全部存儲在名爲SomethingRepository(ProductRepository等)的服務中。 然而,在第二個鏈接中,我們每次使用服務(在任何組件中),都會直接從服務器接收數據。

關於它的最佳實踐是什麼?我只是擔心,如果我們使用本書中介紹的方法,那麼我們不會總是獲得「最新」的可能數據,因爲如果另一個客戶在此期間發生了某些變化,那麼我們仍然會處理在我們的應用正在加載。另一方面,第二種方法可能會影響我們在組件之間共享數據的可能性。

我對此非常困惑,我不確定是否應該將整個模型保存在我的應用程序中,並且有某種存儲庫,或者第二種方法更好。感謝您的任何幫助。

回答

3

產品的集合是不太可能在你的網站上花費的時間來改變。在這種情況下,它與實際緩存獲得的數據相關得多。

的意見的集合,例如在活動留言板,可以在單一頁面訪問期間改變多次。這可能是他們選擇在獲得收藏品時始終致電該服務的原因。儘管在我看來,這不是正確的做法。更好的辦法是使用websocket連接,並從服務器更新集合,而不是每次都獲取集合,很有可能沒有任何變化。

Sooooo,總結起來,它取決於個案,收集到集合,您想要使用哪種緩存。但是我的建議是隻能調用一次服務器,如果它是靜態數據(如產品陣列)。當它是動態數據時,你應該使用websocket來維護集合

2

不幸的是,隨着大多數軟件開發的進行,哪種方法更好的答案是:「取決於」。

正如您已經明確指出的那樣,存儲數據客戶端的方法存在的風險是,如果另一個用戶更改了某些內容,就會冒着本地緩存過時數據的風險。無論是否重要取決於應用程序和緩存的數據類型以及數據更改的頻率等。但是,從每次不必到服務器獲取列表的角度來看,您都會獲得更好的性能。某些類型的數據對於以這種方式緩存更安全(例如,美國各州的名單,甚至是一個產品目錄,這些目錄不是太大,並且不會一分鐘改變) - 對於其他應用程序,您無法負擔得起陳舊的數據。

因此,我的外賣將是使用最適合手頭數據的方法。很多時候,處理緩存失效的複雜性並不值得它所帶來的性能好處,但這絕不是一個你可以在所有情況下使用的全面聲明。瞭解不同的方法以及利益和折衷方案,以便了解何時應用哪種技術。

PS。這個問題可能因爲基於意見而被封閉。它可能更適合:http://softwareengineering.stackexchange.com