2013-04-04 51 views
0

我用breeze開發一個應用程序。我需要這樣我結束了第一方案來檢索本地緩存中使用id = 123的實體:'EntityQuery.fromEntityKey'後按F5似乎用微風清除本地緩存

return manager.fetchEntityByKey("Transport", 123, true) // 3rd param is true --> local cache 
       .then(fetchSucceeded) 
       .fail(queryFailed); 

function fetchSucceeded(data) { 
     var s = data.entity; 
     return s.isPartial() ? refreshTransport(s) : transportObservable(s); 
} 

接下來,我需要擴大一些屬性,所以我結束了第二個場景:

var entityType = manager.metadataStore.getEntityType("Transport"); 
var entityKey = new EntityKey(entityType, 123); 
var query = EntityQuery.fromEntityKey(entityKey) 
         .expand("Sender.City, Sender.City.Country") 
         .using(breeze.FetchStrategy.FromLocalCache); 

return manager.executeQuery(query) 
       .then(fetchSucceeded) 
       .fail(queryFailed); 

function fetchSucceeded(data) { 
    var s = data.results[0]; 
    return s.isPartial() ? refreshTransport(s) : transportObservable(s); 
} 

我對2個場景執行了一些測試,並且在刷新瀏覽器(F5)時發現了不同之處。

第一種情況:按F5時:查詢能夠檢索本地緩存中的數據。所以用戶可以多次按F5鍵,微風仍然會使用本地緩存。

第二種情況:按F5時:查詢在本地緩存中找不到任何內容,則在fetchSucceed中發生錯誤s.isPartial(),因爲s在undefined中。

我的問題:爲什麼在第二個場景刷新瀏覽器似乎清除了本地緩存的微風?如何着手避免這種行爲?

謝謝。

回答

2

當F5按下時,Breeze總是清除本地緩存。 F5使瀏覽器重新加載整個頁面並執行每個js頁面(從main.js開始)。

您會看到不同的行爲,因爲fetchEntityByKey函數中的第三個參數指示Breeze在本地緩存上搜索,如果找不到,請向服務器發出請求。

在第二種情況下,您告訴Breeze從localcache(.using(breeze.FetchStrategy.FromLocalCache);)獲取實體,因此如果實體不在本地緩存中,Breeze將永遠不會訪問服務器。

+0

現在對我來說很清楚。謝謝。 – Bronzato 2013-04-04 09:26:45