使用MergeStrategy.OverwriteChanges时,Breeze不会更新我的列表

时间:2017-02-02 20:43:09

标签: breeze

我有这段代码:

breeze.EntityQuery.from(endpoint)
    .withParameters(withParameters)
    .toType(entity)
    .using(breeze.MergeStrategy.OverwriteChanges)
    .noTracking(false)
    .using(manager)
    .execute()
    .then(_extractResponseResult)
    .catch(_doSomethingElse);

function _extractResponseResult(response) {
    console.log(">>. results: ", results);

    return results;
}

,结果如下所示:

Myitem {
  entityAspect : {...},
  name : 'item name',
  lists : Array[1]
}

每当我执行breeze.EntityQuery.from()方法时,它总是返回一个未更新的列表。这真的开始让我失望。我如何确保更新?就像后端清除列表一样,不应该有任何列表,但是当我breeze.EntityQuery.from()时,即使愚蠢的网络控制台说“列表是空的”,列表仍然存在,所以列表上微风响应应该是空的,但我看,它不是空的。除列表外,所有其他属性都会更新。

我的元数据如下所示:

addType({
name: 'MyEntity',
dataProperties: {
    id: {nullOk: false, isPartOfKey: true},
    name: {}
},
navigationProperties: {
    lists: {
        hasMany: true,
        entityTypeName: 'MyList',
        associationName: 'Foo_MyList'
    }
}
});

我尝试按照建议的here清除缓存,但不幸的是,我的列表实际上显示在SAME PAGE的屏幕的另一部分(用户只是通过复选框将列表作为MyItem的一部分),并且分离的东西,也删除了屏幕上的那些列表,因为它们毕竟是同一个实体,同样的id,这不是我打算做的。

1 个答案:

答案 0 :(得分:0)

处理服务器端删除基本上是缓存一致性问题,并且是hard problem

在这种情况下,您可以使用返回的数据对象的retrievedEntities属性来通知客户端列表中的哪些项目已被返回。

在下面的示例中,我假设查询返回一个MyItem实体,其服务器响应中包含(展开)其所有MyList对象。 retrieveEntities列表将包含所有MyList实体,因此如果缺少一个,我们假设它已在服务器上删除。

manager.executeQuery(query).then(function (data) {
    var myItem = data.results[0];
    var retrieved = data.retrievedEntities;
    myItem.lists.forEach(function (myList) {
        if (retrieved.indexOf(myList) < 0) {
            // already deleted on the server
            myList.entityAspect.setDetached();
        }
    })
    return myItem;
});