我正在玩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的最佳方法是什么?
答案 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;
});
}