ngStorage的$ sync()做了什么?

时间:2017-08-16 16:30:45

标签: angularjs ng-storage

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

除了重新暴露get / set方法之外,它还提供了$ sync()方法。但是localStorage和sessionStorage读取&写入已经是同步的,那么$ sync方法会做什么?

3 个答案:

答案 0 :(得分:0)

正如它在documentation

中所说的那样
  

更改将自动在$ scope。$ storage,$ localStorage和localStorage之间同步 - 即使在不同的浏览器标签中也是如此!

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

答案 1 :(得分: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对象并用作私有函数

答案 2 :(得分:0)

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

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

但它似乎只是那些发生在QA中的人之一,他们正在寻找这类问题。