【问题标题】:Breeze EntityManager does not change entity state after saveChanges call调用 saveChanges 后,Breeze EntityManager 不会更改实体状态
【发布时间】:2013-10-15 11:09:54
【问题描述】:

我正在努力解决 saveChanges 方法的问题。

看来 saveChanges 使实体的状态保持原样,因此在服务器上所做的更改不会反映在客户端上。两种合并策略我都试过了,结果是一样的。

我确实像这样初始化管理器:

var manager = new breeze.EntityManager({ serviceName: serviceUrl });

然后我会在并行调用中获得我需要使用的所有实体。

        manager.fetchMetadata()
            .then(function() {
                store.registerEntityTypeCtor("GameGroup", GameGroup);
                store.registerEntityTypeCtor("Game", Game);
                store.registerEntityTypeCtor("LimitGroup", LimitGroup, LimitGroupInitializer);
                store.registerEntityTypeCtor("Limit", Limit, LimitInitializer);

                addValidators();
                subscribeToStateChanges();
            })
            .then(function() {
                return Q.all([
                    getEntitiesByQuery(gamesQuery, model.games),
                    getEntitiesByQuery(gameGroupsQuery, model.gameGroups),
                    getEntitiesByQuery(limitsQuery, model.limits),
                    getEntitiesByQuery(limitGroupsQuery, model.limitGroups)]);
            })
            .then(function() {
                handlers.onSuccess();
            })
            .fail(function () {
                handlers.onFail();
            });

        function getEntitiesByQuery(query, modelProperty) {
            manager.executeQuery(query)
                .then(function (data) {
                    modelProperty(data.results);
                });
        }

但是假设我们想要更改某个实体的属性: 这是控制台日志:

manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Unchanged"
manager.getEntities('LimitGroup')[0].Name('SomeName')
LimitGroup
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"
manager.hasChanges()
true
manager.saveChanges().done();
undefined
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"

如您所见,调用 saveChanges 后状态仍为“已修改”。 我对名称所做的更改已保存到数据库中,除此之外的所有内容似乎都可以正常工作。 同样的事情发生在“添加”的实体上,但是,如果我在某个实体上调用 setDeleted 方法,它会在调用后立即设置为“分离”,并且在管理器的缓存中找不到。

我查看了一些微风示例,它们没有相同的问题,可能是什么问题?

谢谢!

更新 #1

saveChanges 的调用方式如下:

        self.showBusy();

        manager.saveChanges()
            .then(function (data) {
                self.hideBusy();
                console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
            })
            .fail(saveFailed);

同样,实体状态显示为“已修改”

更新 #2

所以我把 then() 替换为 done() 调用,结果是一样的。

manager.saveChanges()
            .done(function(data) {
                self.hideBusy();
                console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
            });

【问题讨论】:

  • 您的 .then() 在 Breeze 保存更改并更新缓存中的实体之前执行。您需要使用 .fin() 或 .done() 因为它们会等到一切都完成后再处理代码,如我的回答所示。

标签: breeze


【解决方案1】:

以下代码无效,因为您需要将一个函数传递给 done 调用,然后在收到回调后从该点检查实体状态。

manager.saveChanges().done(checkStates);

function checkStates() {
    manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
}

这将等到 saveChanges 回调返回后再检查 entityState。

【讨论】:

  • 不行,还是说明实体被修改了。在问题中有在浏览器控制台中进行的调用,所以当我进行下一次调用时,saveChanges 已经完成。
  • 你怎么知道的?
  • 我看了看网络通信,稍等片刻。在实际代码中,我等待 saveChanges 完成的承诺。请查看更新。
【解决方案2】:

问题是我没有用 BreezeController 属性标记 api 控制器。

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多