首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何存储和检索窗口状态?

如何存储和检索窗口状态?
EN

Stack Overflow用户
提问于 2016-07-11 18:51:20
回答 3查看 3.4K关注 0票数 1

我试图编写用于存储和检索窗口状态的函数,但不知道如何做到这一点。这个想法是,用户可以在任何时候制作屏幕的“快照”,下一次登录到应用程序时,他可以检索回它,也可以存储任意数量的快照。例如:在页面上,我有4个不同的封闭面板,带有某种类型的过滤器,还有6个不同的选项卡,里面有网格(默认情况下,第一个选项卡是打开的)。现在假设,我打开了4个面板中的2个,设置了一些过滤器,并使用了第5个选项卡。我希望能够存储整个窗口状态(例如“我的状态1"),当我下次登录时,只需选择"My state 1”并返回我的窗口状态。我已经用下面的函数在DB中存储和检索所有网格属性:

商店:

代码语言:javascript
复制
 $scope.state = {}
 $scope.saveStateString = function(store) {
        $scope.state = JSON.stringify($scope.gridApi.saveState.save(store));
        // console.log("function save state string")
   };

检索

代码语言:javascript
复制
    if(objNode.folderId){
       eventService.singleFilter(nodeId)
             .then(function (res) {
                   if (res.body){
       $scope.restoreStateString(JSON.parse(res.body));
              }
           });
        }
   else if (typeof objNode.folderId === "undefined"){
         return false
    }

   $scope.restoreStateString = function(restore) {
         $scope.gridApi.saveState.restore( $scope, restore );
     };

现在,我正在尝试将窗口状态存储在本地存储中,然后执行以下操作:

代码语言:javascript
复制
 var storeValue = null;
        var keyName = null;
        var _window = {};


        $scope.storeWorkspace = function (){

            for (prop in window)
                _window[prop] = window[prop];

            storeValue = JSON.stringify(_window)

            keyName = prompt("put your key name");
            localStorage.setItem(keyName, storeValue);
        };

但我知道这个错误

angular.js:13708 TypeError:在Object.stringify (原生)中将循环结构转换为JSON

我很清楚,为什么我会收到这个错误,这会导致JSON不接受循环对象--那些引用自己的对象--我从console.log(_window)看到“窗口”里面有很多对象,所以我决定问:如何存储和检索窗口状态?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-11 19:03:34

存储在window对象上的绝大多数值都是不可序列化的。您将无法为此使用JSON。相反,您应该跟踪对window所做的所有更改,并将这些更改作为POJO存储在单独的JSON对象中。或者,您可以在应用程序启动时复制初始的window对象,然后只存储当前window对象与原始副本之间的差异。

在任何情况下,这可能是一次反复尝试,取决于您使用的是哪些库,以及它们是如何使用全局变量的。您可能会发现在序列化时需要手动过滤掉一些内容。最佳实践将建议不向window对象写入任何东西。如果有东西写入window对象,则可能是在处理行为恶劣的代码。

票数 1
EN

Stack Overflow用户

发布于 2016-07-11 19:31:12

不要将应用程序数据和资源混合起来存储,因为它很大,很难重用,并且会导致遇到其他问题。

保持简单!

使用重新加载视图所需的内容构造appState对象

代码语言:javascript
复制
var appState ={config:{}, data:{}}; 

将其存储在internalStorage / sessionStorage中,根据每次会话要保留多长时间

代码语言:javascript
复制
localStorage.setItem("appState", appState);

在初始应用程序启动逻辑中,从internalStorage / sessionStorage或服务器加载数据,您可以修改现有控制器代码将其绑定到视图。

代码语言:javascript
复制
getApplicationData(){
 var appState = localStorage.getItem("appState");//get it from browser storage
if(!appState)
   //get it from server
return appState;
}

这是一种更健壮、更有表现力的方法。

票数 2
EN

Stack Overflow用户

发布于 2016-07-11 19:03:24

window**.**不尝试将整个存储应用程序的状态,而是将应用程序的状态存储在一个单独的对象中,例如state,如果您必须这样做的话,您可以将它附加到全局对象:

代码语言:javascript
复制
window.state = {}; // your application's state goes here

var serializedState = JSON.stringify(window.state); // To be put into localStorage

确保在下一次启动过程中重建应用程序所需的所有信息都包含在这个对象中,仅此而已。尽可能避免全局状态。

还要确保state对象只包含可序列化的数据。例如,函数或符号不能串行化为JSON字符串,并将在此过程中丢失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38314121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档