我想使用breezejs api将数据存储在本地存储(indexdb或websql)中,并且还希望将本地数据与sql server同步。
但我无法实现这一目标,也无法使用breezejs,knockout和mvc api找到此类应用程序的示例应用程序。
我的要求是:
1)如果互联网可用,数据将来自sql server,使用mvc web api。
2)如果互联网关闭,应用程序将从缓存的本地存储(indexdb或websql)中检索数据。
3)一旦上网,本地数据就会同步到sql server。
请让我知道我是否可以使用breezejs api来实现此要求?
如果是,请提供一些链接和样本。
如果不是,我们还可以用什么来达到这种要求?
感谢。
请帮我满足这个要求。
答案 0 :(得分:2)
你可以这样做,但我建议只使用localstorage。基本上,每次从服务器读取或保存到服务器时,都会导出实体并将其保存到本地存储。然而,当您需要读入数据时,如果服务器无法访问,您可以从localstorage读取数据并使用importentities将其导入管理器,然后在本地查询。
function getData() {
var query = breeze.EntityQuery
.from("{YourAPI}");
manager.executeQuery.then(saveLocallyAndReturnPromise)
.fail(tryLocalRestoreAndReturnPromise)
// If query was successful remotely, then save the data in case connection
// is lost
function saveLocallyAndReturnPromise(data) {
// Should add error handling here. This code
// assumes tis local processing will be successful.
var cacheData = manager.exportEntities()
window.localStorage.setItem('savedCache',cacheData);
// return queried data as a promise so that this detour is
// transparent to viewmodel
return Q(data);
}
function tryLocalRestoreAndReturnPromise(error) {
// Assume any error just means the server is inaccessible.
// Simplified for example, but more robust error handling is
// warranted
var cacheData = window.localStorage.getItem('savedCache');
// NOTE: should handle empty saved cache here by throwing error;
manager.importEntities(cacheData); // restore saved cache
var query = query.using(breeze.FetchStrategy.FromLocalCache);
return manager.executeQuery(query); // this is a promise
}
}
这是一个简单的代码框架。您应该检查catch和处理错误,添加isConnected函数以确定连接性等。
如果你在本地进行编辑,还有一些可以跳过的箍。每次更改缓存时,都需要导出整个缓存或更改(可能取决于缓存的大小)。当存在连接时,您将需要首先测试本地更改,如果找到,则在重新检查服务器之前将它们保存到服务器。此外,在离线复杂化时所做的任何架构更改都非常重要,因此请注意这一点。
希望这会有所帮助。一个强大的实现有点复杂,但这应该给你一个起点。