删除扩展项后,更新AngularJS绑定并从缓存中查询

时间:2014-02-13 13:41:36

标签: javascript angularjs breeze

请参考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不会显示分离的实体,但出于某种原因它是......

1 个答案:

答案 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需要这个导航属性来删除扩展的项目并让它们反映在绑定中?