我有这段代码:
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,这不是我打算做的。
答案 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;
});