使用angular and breeze处理新的SPA,发现当Chrome没有时,Firefox会抛出错误。该应用程序能够脱机工作,所以当我第一次加载应用程序(并因此填充缓存)时它工作得很好。如果我关闭浏览器并重新打开它,应用程序似乎正确加载。只要我点击从breeze触发查询的任何内容,它就会抛出“JSON为null”错误。
然后,我尝试根据SO上的建议在客户端(importMetadata)上加载元数据。 我使用hasServerMetadata创建了dataService为false但由于某种原因,Firefox仍然触发从服务器中提取元数据。 Chrome不会发生这种情况。在两种情况下,我都使用Fiddler观察流量。 当然,当Firefox进行服务器调用时,元数据已经被填充,并且它会抛出一个错误,即实体类型已存在于元数据存储中。
还有其他人有过类似的问题吗?有没有想过为什么会在Firefox中发生这种情况而不是在Chrome中呢?
更新: 在工厂中,我用来创建breeze实体管理器,我在一些日志记录中查看是否可以找出正在发生的事情。这是fn。
function createMetadataStore() {
console.log('loading metadata from local js');
var store = new breeze.MetadataStore();
console.log(window.app.metadata);
model.configureMetadataStore(store);
store.importMetadata(window.app.metadata); //used for offline import of metadata
console.log(store.hasMetadataFor(serviceName));
console.log('should have the metadata now');
return store;
}
我看到按预期记录了元数据,但是在store.importMetadata(window.app.metadata)调用hasMetadataFor(serviceName)调用之后立即返回false。 我删除了model.configureMetadataStore调用但没有效果。 关于为什么hasMetadataFor调用在导入元数据后会立即返回false的任何想法?我哪里错了?
更新2:不确定为什么我必须这样做,而是使用store.addDataService(dataService)显式添加数据服务;我创建商店后就做了伎俩。希望如果他们遇到这种情况,这将有助于其他人。
更新3:好的,addDataService技巧解决了一个问题,但原来的'JSON为null'错误重新出现。我终于找到了它,并把它放在这里以防万一其他人遇到这个。问题在于我用来压缩本地存储数据的lz-string.js库。事实证明你必须使用compressToUTF16和decompressFromUTF16,因为普通的压缩和解压缩功能在FireFox上不起作用。 (http://pieroxy.net/blog/pages/lz-string/guide.html)
所以事件链是: 1.从服务器加载数据,压缩数据并将其存储在本地存储中。 2.在离线加载应用程序时,从本地存储中提取压缩数据,解压缩并将其传递给breeze.importEntities - 这是失败的地方。
我在获取本地存储时测试了null,并且通过了。不幸的是,对导入实体的调用从未收到过JSON数据。切换到lz-string函数的UTF16版本解决了这个问题。最终适用于Firefox和Chrome,没有任何问题。