0

我在玩breezejs,但我遇到的问题是计算出的淘汰赛observable 没有得到更新。让我用一个虚构的例子来解释:

我有一个实体(会话)与另一个实体(演讲者)有一对多的关系。我使用微风js中的扩展功能获取所有相关演讲者的所有会话:

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

在微风管理器上,我在实体构造函数中配置了一个计算的 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;
    });
}

然后我可以在视图中收听这个 observable:

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

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

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

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

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

如果我刷新页面,那么它会正确隐藏跨度。

更新

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

4

1 回答 1

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;
    });
}
于 2013-06-21T14:28:19.467 回答