0

ngStorage 是 AngularJS 的浏览器 localStorage 和 sessionStorage 对象的包装器。

除了重新公开 get/set 方法外,它还提供了一个 $sync() 方法。但是 localStorage 和 sessionStorage 的读写已经是同步的,那么 $sync 方法是做什么的呢?

4

3 回答 3

0

正如文档中所说

更改将在 $scope.$storage、$localStorage 和 localStorage 之间自动同步 - 即使跨不同的浏览器选项卡!

从这里可以看出,如果出于某种原因,显式 $sync 调用会更新 $storage 以与本地/会话存储同步。通常不应该手动调用它,这就是它没有记录的原因。

于 2017-08-16T16:41:01.990 回答
0

来自https://github.com/gsklee/ngStorage/blob/master/ngStorage.js

 $sync: function () {
                        for (var i = 0, l = webStorage.length, k; i < l; i++) {
                            // #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
                            (k = webStorage.key(i)) && storageKeyPrefix === k.slice(0, prefixLength) && ($storage[k.slice(prefixLength)] = deserializer(webStorage.getItem(k)));
                        }
                    }

据我了解,它将数据从内部$storage对象写入真实的浏览器webStorage对象并用作私有函数

于 2017-08-16T16:41:29.983 回答
0

角度服务接受对象,但浏览器存储只接受字符串。因此,它基本上使用带有 gettor/settor 的代理对象来适当地调用 JSON.stringify() 或 JSON.parse()。

手动调用 $sync() 和 $apply() 可以进行安全检查。由于存储跨浏览器选项卡,因此存在潜在的多线程问题。在用户的更改发生与自动调用 $sync 的角度摘要之间有一个时间窗口,其中一个浏览器选项卡中的数据更改可能会消除另一个试图同时更改同一对象的选项卡的更改。

但这似乎是那些在寻找它的人中唯一发生的问题之一。

于 2018-02-19T05:49:52.670 回答