ko.JSON 与 observableArray 抛出未捕获的 DOMException
ko.JSON with observableArray throws Uncaught DOMException
我正在尝试将一个可观察数组保存到 localStorage。为此,我使用 ko.toJSON.
var that = this;
this.items = ko.observableArray();
this.items.subscribe(function(){
localStorage.setItem("items", ko.toJSON(that.items()));
});
所有持久化到 localStorage 的是 false
。
它抛出一个非常随机的错误:knockout-3.4.2.js:55 Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
。
知道这里发生了什么吗?
我也得到了一个简单的 var json = ko.toJSON(that.items());
错误,所以它显然来自于此。但是,简单地执行此操作时我不会收到该错误:var json = ko.toJSON([{'key': 'value'}]);
.
更新:这是完整的错误消息:
Uncaught DOMException: Failed to read the 'cssRules' property from
'CSSStyleSheet': Cannot access rules
at http://localhost:8080/js/knockout-3.4.2.js:55:405
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
更新 2:这是问题所在的实际代码部分:
这是问题的确切上下文:
this.savedPlaces.subscribe(function() {
// Add all places to filteredPlaces
that.filterPlaces();
// Reinitialize the filter
that.filterString("");
// Update the markers
that.updateMarkers();
// Store itself in localStorage
localStorage.setItem("savedPlaces", ko.toJSON(that.savedPlaces()));
});
当我注释掉最后一行时,我没有遇到任何问题。
如果我将其替换为:localStorage.setItem("savedPlaces", ko.toJSON([{item: "item"}]));
,我也没有问题
我试图给出 items
的内容示例,但显然 observableArrays 是深层(递归)对象,因此我无法在 Chrome 上为 DevTools 控制台复制粘贴。但是它看起来像:
[{'marker': a_google_maps_marker_object,
'place': {data: mostly strings...}]
我发现了问题。
我的可观察数组包含一个 Google 地图标记。这些是递归数组,无法进行 JSON 化。
我从数组中删除了 Google 地图标记,一切正常。
虽然 Knockout 抛出了这个神秘的错误,但仍然很奇怪。
我正在尝试将一个可观察数组保存到 localStorage。为此,我使用 ko.toJSON.
var that = this;
this.items = ko.observableArray();
this.items.subscribe(function(){
localStorage.setItem("items", ko.toJSON(that.items()));
});
所有持久化到 localStorage 的是 false
。
它抛出一个非常随机的错误:knockout-3.4.2.js:55 Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
。
知道这里发生了什么吗?
我也得到了一个简单的 var json = ko.toJSON(that.items());
错误,所以它显然来自于此。但是,简单地执行此操作时我不会收到该错误:var json = ko.toJSON([{'key': 'value'}]);
.
更新:这是完整的错误消息:
Uncaught DOMException: Failed to read the 'cssRules' property from
'CSSStyleSheet': Cannot access rules
at http://localhost:8080/js/knockout-3.4.2.js:55:405
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
at c (http://localhost:8080/js/knockout-3.4.2.js:56:172)
at b (http://localhost:8080/js/knockout-3.4.2.js:55:380)
at http://localhost:8080/js/knockout-3.4.2.js:56:23
更新 2:这是问题所在的实际代码部分:
这是问题的确切上下文:
this.savedPlaces.subscribe(function() {
// Add all places to filteredPlaces
that.filterPlaces();
// Reinitialize the filter
that.filterString("");
// Update the markers
that.updateMarkers();
// Store itself in localStorage
localStorage.setItem("savedPlaces", ko.toJSON(that.savedPlaces()));
});
当我注释掉最后一行时,我没有遇到任何问题。
如果我将其替换为:localStorage.setItem("savedPlaces", ko.toJSON([{item: "item"}]));
我试图给出 items
的内容示例,但显然 observableArrays 是深层(递归)对象,因此我无法在 Chrome 上为 DevTools 控制台复制粘贴。但是它看起来像:
[{'marker': a_google_maps_marker_object,
'place': {data: mostly strings...}]
我发现了问题。 我的可观察数组包含一个 Google 地图标记。这些是递归数组,无法进行 JSON 化。
我从数组中删除了 Google 地图标记,一切正常。
虽然 Knockout 抛出了这个神秘的错误,但仍然很奇怪。