请参考this question作为背景。
运行包含展开以获取相关实体的查询后,如果删除其中一个展开的实体,那么breeze缓存如何更新?
我问这个,因为(根据推荐的引用问题的解决方案),我发现如果我在删除扩展项后从缓存中查询,该项仍然会出现,除非我强制调用服务器。
这是我目前用于从缓存中检索的功能(如果可用)或服务器(如果不可用)。删除后,我正在强制调用此函数。
function _getByIdExpanded(resource, id, expand, forceRefresh) {
var self = this;
if (!forceRefresh) {
var entity = self.em.getEntityByKey(resource, id);
if (entity && entity.isReadyForEdit) {
//logSuccess('Retrieved ' + resource + ' ' + entity.name + ' from cache', entity, true);
if (entity.entityAspect.entityState.isDeleted()) {
entity = null;
}
return self.$q.when(entity);
}
}
return eq.from(resource + 's') //pluralise for table name in DB
.where('id', '==', id)
.expand(expand)
.using(self.em).execute()
.to$q(succeeded, self._failed);
function succeeded(data) {
var result = data.results;
entity = result[0];
if (!entity) {
logError('Could not find ' + resource + ' with id: ' + id, null);
return null;
}
entity.isReadyForEdit = true;
//logSuccess('Retrieved ' + resource + ' ' + entity.name + ' from server', entity, true);
return entity;
}
}
编辑:
好的,经过一些测试后,看来我的错误实际上是一个角度不是轻而易举的。
以下是我的控制器中与之相关的两个调用:
function deleteEntity(entity) {
return bsDialog.deleteDialog(entity.name).then(function () {
datacontext.markDeleted(entity);
save().then(function () {
if (entity.entityType === dboardConfigEntity) {
$location.path('/subscriber/' + subscriberId);
} else { getDboardConfig(true); } // forcing call back to server for testing
});
});
}
function getDboardConfig(forceRefresh) {
if ($routeParams.newOrExisting === 'new') {
subscriberId = $routeParams.id;
return vm.dboardConfig = datacontext.dboardConfigs.create(subscriberId);
}
return datacontext.dboardConfigs.getByIdExpanded($routeParams.id, forceRefresh)
.then(function (data) {
vm.dboardConfig = data;
subscriberId = vm.dboardConfig.subscriberId;
vm.hideChildren = false;
});
}
这个调用只是一个抽象存储库的传递(它包含我上面第一篇文章中的函数):
function getByIdExpanded(id, forceRefresh) {
var expand = 'Dims';
return this._getByIdExpanded(entityName, id, expand, forceRefresh);
}
这是我在datacontext中的删除和保存调用:
function markDeleted(entity) {
return entity.entityAspect.setDeleted();
}
function save() {
return em.saveChanges()
.to$q(saveSucceeded, saveFailed);
function saveSucceeded(result) {
logSuccess('Successfully saved to the server', result, true);
return result;
}
function saveFailed(error) {
var msg = config.appErrorPrefix + 'Failed to save changes to the server. '
+ breeze.saveErrorMessageService.getErrorMessage(error);
error.message = msg;
logError(msg, error);
throw error;
}
}
我的标记摘录:
<table class="table table-condensed table-striped" data-ng-show="vm.dboardConfig.dims.length > 0">
<thead>
<th>{{dt.name}}</th>
<th></th>
</thead>
<tbody>
<tr data-ng-repeat="d in vm.dboardConfig.dims | filter:{ dimTypeId: dt.id }">
<td>{{d.name}}</td>
<td>
<div class="pull-right">
<a href="" data-ng-click="vm.edit(d)">
<i class="fa fa-pencil blue"></i>
</a>
<a href="" data-ng-click="vm.delete(d)">
<i class="fa fa-times-circle red"></i>
</a>
</div>
</td>
</tr>
</tbody>
</table>
据我所知,我正在解决从查询中返回的所有承诺,为什么我的表中的元素不会更新,除非我刷新?
进一步编辑:
在浏览器调试器运行之后,我注意到即使我已经标记了已扩展的子实体以进行删除并保存,当我运行查询以检索更新的实体时,仍然包含扩展的子节点,但是处于分离状态,表示微风已保存删除。在回顾了一些关于此的Breeze文档之后,问题就归结为此 - 如何调整我的代码以使Angular不绑定分离的实体?我以前的理解是Angular不会显示分离的实体,但出于某种原因它是......
答案 0 :(得分:1)
好的,所以在SO搜索帖子后,终于遇到了this one。
对于那些感兴趣的人,我的案例中的问题是由Breeze引起的。我上面的所有代码似乎都没问题。
然而,我原来的Dim课程设计(我的#34;扩展&#34;实体)是......
public class Dim
{
public int Id { get; set; }
public string Name { get; set; }
public int DboardConfigId { get; set; }
public int DimTypeId { get; set; }
public DimType DimType { get; set; }
}
该实体没有返回DboardConfig的导航属性。因为我没有必要导航到任何DboardConfig的属性,我认为这是不必要的。但是,当它发生时,似乎缺少导航属性会导致我的问题中描述的问题。因此,通过向类添加属性public DboardConfig DboardConfig { get; set; }
,问题就消失了。
我很想知道为什么Breeze需要这个导航属性来删除扩展的项目并让它们反映在绑定中?