【问题标题】:Store and Sync local Data using Breezejs and MVC Web API使用 Breezejs 和 MVC Web API 存储和同步本地数据
【发布时间】:2014-11-28 16:29:49
【问题描述】:

我想使用breathjs api将数据存储在本地存储(indexdb或websql)中,并且还想将本地数据与sql server同步。

但我没能做到这一点,也无法找到这种类型的应用程序示例应用程序使用轻风,淘汰赛和 mvc api。

我的要求是:

1) 如果互联网可用,数据将通过使用 mvc web api 来自 sql server。

2) 如果互联网关闭,应用程序将从缓存的本地存储(indexdb 或 websql)中检索数据。

3) 只要网络一打开,本地数据就会同步到sql server。

请告诉我是否可以通过使用breezejs api 来实现这个要求?

如果是,请提供一些链接和示例。

如果不是,我们还可以使用什么其他方法来实现此类要求?

谢谢。

请帮我满足这个要求。

【问题讨论】:

    标签: asp.net-mvc-4 local-storage breeze asp.net-web-api


    【解决方案1】:

    您可以这样做,但我建议您只使用本地存储。基本上,每次从服务器读取或保存到服务器时,都会导出实体并将其保存到本地存储。那么,当你需要读入数据的时候,如果服务器不可达,你就从localstorage中读取数据,然后使用importentities把数据读入manager,然后在本地查询。

    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
        }
    }
    

    为简单起见,这是一个代码框架。您应该检查捕获和处理错误,添加一个 isConnected 函数来确定连接等。

    如果您在本地进行编辑,则需要跳过更多的环节。每次对缓存进行更改时,都需要导出整个缓存或更改(可能取决于缓存的大小)。当有连接时,您需要先测试本地更改,如果发现,在重新查询服务器之前将它们保存到服务器。此外,离线时进行的任何架构更改都非常复杂,因此请注意这一点。

    希望这会有所帮助。一个健壮的实现有点复杂,但这应该给你一个起点。

    【讨论】:

    • 这条线是强制性的吗? window.localStorage.setItem('savedCache',data); Breezejs 在哪里保存它的缓存数据?我们是否明确需要保存在本地存储中?
    • 没有。 Breeze 单独保存它的缓存。该行确保当您再次启动应用程序时,如果没有与服务器的连接,您可以使用来自服务器的最新数据。如果您没有关闭选项卡或浏览器,则不需要保存到本地存储,只需从缓存中工作即可。我的经验是,最终用户在启动网页时总是想要那里的数据,无论是否连接到服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多