私は Breezejs で遊んでいますが、計算されたノックアウト オブザーバブルが更新されないという問題があります。構成例で説明しましょう:
別のエンティティ (スピーカー) と 1 対多の関係を持つエンティティ (セッション) があります。Breezejs の展開機能を使用して、関連するすべてのスピーカーを含むすべてのセッションをフェッチします。
breeze.EntityQuery.from('Sessions').expand('Speakers');
ブリーズ マネージャーでは、エンティティ コンストラクターで計算されたオブザーバブルを構成しています。
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 でこれを行う最善の方法は何ですか?