2013-10-31 60 views
1

我最近一直在嘗試breezejs,並且正在考慮將它用於許多個人和工作項目,因爲我喜歡它。我知道現在所有的風格都是單頁面應用程序,我明白了,但我們假設您不想引入新的路由框架,並且只是使用.NET MVC默認路由引擎。每次發生POST /重定向時,您都將失去breeze的實體管理器對元數據和其他實體的客戶端緩存功能。使用BreezeJS無SPA

其中一個問題是我們有一大組元數據(.5mb)針對每個請求發出。現在,如果在重定向之前客戶端有任何其他請求,那麼該元數據將被緩存並且一切正常。我試圖避免除了靜態列表之外還需要下載每個視圖的元數據,我還會在實體管理器中緩存這些靜態列表。我知道元數據可以通過製作更小的對象圖來優化,但我們不關注它。

我想出的一件事是將元數據存儲在localStorage中,然後在頁面加載中檢索它。

function exportMetadata() { 
    var metadata = emanager.metadataStore.exportMetadata(); 
    window.localStorage.setItem('somename', metadata); 
} 
function importMetadata() { 
    var metadata = window.localStorage.getItem('somename'); 
    var mstore = new breeze.MetadataStore(); 
    mstore.importMetadata(metadataFromStorage); 
    manager.metadataStore = mstore; 
} 

雖然這工作(並與不同的語法靜態列表工作)感覺哈克,似乎違背圖書館怎樣來使用。我不禁想到BreezeJS與SPA架構相結合,將其所有功能都用作書面。也許我正在考慮錯誤的方式?有沒有關於如何在SPA之外使用BreezeJS的建議或例子?

回答

2

Breeze適用於單頁面應用程序(SPA),它被假定爲在頁面刷新之間有很長的用戶會話。我不確定爲什麼你不需要客戶端路由框架(例如Durandal或Angular)。但它確實發生,你會不時切換頁面。

當你應用程序,甚至推薦的做法實在是小的,模塊化的應用程序的一個聯盟 - 每個獨立地開發和維護 - 和用戶跨越「橋」從一個模塊到另一個。

您的解決方案正是我所做的:從瀏覽器本地存儲中存儲和恢復元數據。正如你所說,你可以將它與隱藏/恢復元數據和(大部分)靜態引用列表實體結合在一個單一的序列化緩存中。

採取這種做法在所有國際海事組織中都不算什麼。 我們希望Breeze以這種方式工作。事實上,這是一個很好的方式來獲得更快的「常規」SPA的啓動和加載時間。

我很想知道你爲什麼認爲這是「hacky」。我對Breeze可以爲你做什麼而不是這種做法感興趣。理想的世界會是什麼?

+0

當我說'hacky'時,我指的是在非SPA應用程序中使用Breeze。我的主要意圖是就Breeze是否應該用於非SPA應用程序而徵求一些迴應。你的第一句話會表明不是,但你也同意你會以同樣的方式解決我上面提到的問題。我們有一個使用.net MVC和WCF服務構建的完整應用程序。我認爲本地緩存方法只是在對Web API進行完全重構之前移除笨重的Web服務的一個障礙。當項目開始衰退時(對...),我們會跳到Durandal或Angular。 – totaldis

+0

我明白了。是的,如果用戶一段時間沒有在網頁上生活,微風的價值就會有限。如果他們長時間保持放置狀態並且頁面只是回到服務器進行AJAX調用,它仍然很有價值。他們過去稱這種風格的應用程序爲「AJAX應用程序」。直到最近這個名字才變成了「SPA」(一個可怕的名字......但我不能決定)。 – Ward