0

私は 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 でこれを行う最善の方法は何ですか?

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 に答える