breeze.js元数据和firefox

时间:2014-06-27 18:29:18

标签: angularjs google-chrome firefox metadata breeze

使用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,没有任何问题。

0 个答案:

没有答案