1

我有一个 SPA(热毛巾模板)并window.localStore用于在浏览器中保存数据。我从微风 1.3.3 中使用了导出/导入,当我在第一次测试时清除浏览器历史记录时,它们运行良好,后来我没有清除浏览器历史记录,这些运行正常,再次将实体导出/导入到window.localStore. 但经过多次测试后,浏览器显示下一个错误:

SCRIPT5022: This key is already attached: Project:#Solution.Project--1

当我关闭浏览器并且我没有在第一次测试时清除浏览器历史记录时出现错误。

当我加载 SPA 时,首先我加载了微风的数据window.localStore和使用importEntities功能。

SPA 加载manager.getChanges().length结果为零 ( 0),这是正确的,稍后我调用下一个函数setLocalStorageToManager来加载实际管理器中的未决更改。

function setLocalStorageToManager(manager) {
var name = 'pendingChangesOnLocalStorage';
if (window.localStorage.length > 0) {
    var importData = window.localStorage.getItem(name);
    if (importData) {
        return manager.importEntities(importData,
            { mergeStrategy: breeze.MergeStrategy.PreserveChanges });

    } else {
        return manager;
    }

} else {
    return manager;
}
}

错误出现在这里:

manager.importEntities(importData,{ mergeStrategy: breeze.MergeStrategy.PreserveChanges });

例如,在我的测试中,window.localStore返回两个实体id:-1id:-2,但breeze.debug.js在下一个函数中读取第一个实体id:-1,但后来再次读取第二个实体,id:-1这是错误This key is already attached

proto.attachEntity = function (entity, entityState) {
    // entity should already have an aspect.
    var ix;
    var aspect = entity.entityAspect;
    var keyInGroup = aspect.getKey()._keyInGroup;
    ix = this._indexMap[keyInGroup];
    if (ix >= 0) {
        if (this._entities[ix] === entity) { //-->Error here
            return entity;
        }
        throw new Error("This key is already attached: " + aspect.getKey());
    }

    if (this._emptyIndexes.length === 0) {
        ix = this._entities.push(entity) - 1;
    } else {
        ix = this._emptyIndexes.pop();
        this._entities[ix] = entity;
    }
    this._indexMap[keyInGroup] = ix;
    aspect.entityState = entityState;
    aspect.entityGroup = this;
    aspect.entityManager = this.entityManager;
    return entity;
};

错误出现在第三次测试(导出数据到localStorage并导入此数据)没有删除浏览器历史记录的情况下,我在IE10、Google Chrome Version 27.0.1453.93 m和Firefox 21.0中进行了测试。

请任何帮助非常感谢

4

0 回答 0