如果关系被删除,Breezejs不会触发敲除更新

时间:2013-06-21 14:22:52

标签: knockout.js breeze

我正在玩breezejs,我遇到的问题是计算出的挖掘可观察性没有得到更新。让我用一个简单的例子来解释:

我有一个实体(Session)与另一个实体(Speaker)有一对多的关系。我使用breezejs中的expand函数获取所有相关演讲者的所有会话:

breeze.EntityQuery.from('Sessions').expand('Speakers');

在breeze管理器上,我在实体构造函数中配置一个计算的observable:

var mgr = new breeze.EntityManager(config.remoteServiceName);
mgr.metadataStore.registerEntityTypeCtor('Session', null, sessionInitializer);

function sessionInitializer(session) {
    session.hasOldSpeaker = ko.computed(function () {
        for (var i = 0; i < session.speakers.length; i++) {
            var speaker = session.speakers[i];

            if (speaker.age() > 40) {
                return true;
            }
        }

        return false;
    });
}

然后我可以在视图中听取这个观察结果:

<span data-bind="visible: session.hasOldSpeaker">....</span>

现在我有一个按钮可以从会话中删除旧的扬声器,这样我们就不再有任何旧的扬声器了。我做了一个正常的ajax请求,因为它不仅仅是更新数据库,还必须完成其他一些工作,所以我不认为我可以通过微风来做到这一点。无论如何,在工作完成后,我告诉微风刷新实体:

var refreshQuery = breeze.EntityQuery.fromEntities(session).expand('Speakers');
manager.executeQuery(refreshQuery);

刷新似乎工作正常,因为会话的相关发言人列表现在为空 - 但视图不会更新以隐藏上面的跨度。

有人知道为什么计算的绑定没有更新吗?

如果我刷新页面,则会正确隐藏范围。

更新

在使用Breeze的entityAspect.setDeleted将会话的所有发言者标记为已删除后进行测试后,我可以看到敲除绑定按预期工作。所以我认为问题在于我刷新会话实体的方式。也许有人有更好的方式使用这样的微风? - 这不仅仅是数据库更新,我还需要在服务器上启动一些工作。使用Breeze的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

根据我所知道的,看起来你的计算机看起来并不像Knockout知道订阅hasOldSpeaker属性,只看到说话者的年龄(如果你改变会话的发言者就不会改变)

因为您正在计算hasOldSpeaker属性并且只订阅age属性,所以通过简单地更改会话或发言者,除了发言者年龄之外,它不会订阅除我所知道的任何内容。将您的计算器包装在if语句中应该正确地订阅会话的扬声器属性。

function sessionInitializer(session) {
    session.hasOldSpeaker = ko.computed(function () {
        if (session.speaker()) {
            for (var i = 0; i < session.speakers.length; i++) {
                var speaker = session.speakers[i];

                if (speaker.age() > 40) {
                    return true;
                }
                else { return false; }
            }
        }

        return false;
    });
}