2

これが繰り返しである場合は申し訳ありませんが、私は Breezejs.com のドキュメントを調べていて、「ベスト プラクティス」について少し詳しく説明できるかどうかを確認したかったのです。

.extend を使用して、親オブジェクトにいくつかのナビゲーション プロパティをロードしています。そのオブザーバブル配列にエンティティを追加したいときは、モーダル ポップアップを使用しています。モーダルを呼び出すビューに空白のエンティティが追加されていますが、エンティティを作成して監視可能な配列を保存した後にモーダルを閉じると、メイン ページの新しいエンティティが空白のままになります。

http://www.breezejs.com/documentation/navigation-propertiesは、 Observable 配列に .push() を使用するとオブジェクトが配列に追加されるため、これを正しく行っているかどうか、またはより良い方法。おかしいと思われる理由は、エンティティをモーダルから親ビューに戻してからプッシュする必要があり、おそらくもっと良い方法があると思ったからです。

編集

親のビュー モデルから、Durandal.js の app.js を使用してモーダルを表示します。

var addComment = function () {
    rfcommentcreate.responseFormId(responseForm().id());
    app.showModal(rfcommentcreate).then(function (modalResult) {
        if (!modalResult) { datacontext.cancelChanges(); return false; }
        console.log(modalResult);  // Just to make sure the result is not null and of the right type
        responseForm.responseFormResponseFormComments.push(modalResult);
        return true;
    });
};

モーダルに保存すると、作成されたオブジェクトが返されます。

    datacontext.saveChanges()
        .fail(initFailed)
        .fin(complete);

    function complete() {
        self.modal.close(responseFormComment());  // responseFormComment is the entity that I work on in the modal
    }

ResponseForm.ResponseFormResponseFormComments は、ResponseForm のナビゲーション プロパティです。

上記のコードはエンティティを Breeze のエンティティ マネージャに追加しますが、Knockout は作成後にエンティティを追跡しません。親ビューの私のHtmlには次のようなものが表示されるため、これは本当のステートメントのようです

: @

HTMLコードから

<span data-bind="text: user().fullName"></span> : <span data-bind="text: message"></span> @ <span data-bind="DateTime: commentDt"></span>

モーダルでエンティティを作成した後

私がそれを適切に解釈していれば動作するはずです。

A: そうではなく、おそらく私のせいです B: ナビゲーション プロパティを配列に「プッシュ」せずに追跡するためのより良い方法はありますか?

Orders() ではなく Orders にプッシュしたことに注意してください。

4

3 に答える 3

2

何をしているのか正確にはわかりませんが、エンティティを取得するために再クエリや保存と更新を行う必要はありません。ビューモデルに問題があると思います。UI を使用せずに追加/プッシュ ロジックを実行してみて、問題が解決するかどうかを確認してください。私の推測では、そうなるでしょう。その場合は、バインド ロジックを詳しく調べる必要があります。

于 2013-05-21T22:31:03.877 に答える
2

KO にはタイミングの問題が発生する可能性があります。私はそれが不器用であることを知っていますが、次のことを試すことができます(ところで、modalResult直感的ではないため、関数パラメーターの名前を変更しました):

app.showModal(rfcommentcreate).then(関数 (コメント) {
        if (!comment) { datacontext.cancelChanges(); false を返します。}
        console.log(コメント); // 結果が null ではなく、正しい型であることを確認するため
        responseForm.responseFormResponseFormComments.push(コメント);
        Q.delay(真、5)を返します; // 5 ミリ秒後に true を返し、別の JS イベント ループ サイクルを取得します。
    });

私の提案は最後の行にあります:

Q.delay(真、5)を返します; // 5 ミリ秒後に true を返し、別の JS イベント ループ サイクルを取得します。

Q API リファレンスQ.delayのメソッドを参照してください。私がやっていることは、Breeze による配列の更新によって発生したイベントを聞き、それに応じて応答する機会を KO に与えることです。

ResponseFormCommentからへの戻るナビゲーションがある場合ResponseForm、ナビゲーション プロパティにプッシュするとは思わないでください (本当にresponseFormResponseFormComments"responseForm" を 2 回呼び出すのでしょうか?)。

私はむしろ書きたい:

コメント.responseForm(responseForm); // エンティティの割り当て

また

comment.responseFormId(responseForm.id); // 外部キーの割り当て

responseForm両方とも、のコメント コレクションを更新するという意図された副作用があります。

しかし、主な問題に戻ります...遅延を試して、それが機能するかどうかをお知らせください. ときどきKOとBreezeのタイミングがずれることがある。

于 2013-05-24T02:03:56.163 に答える
1

Ward の助けのおかげで、問題をより正確に突き止めることができました。.push を使用する必要があるのは回避策であり、とにかく実際には機能していませんでした。私の問題は、実際にはエンティティを作成してからナビゲーション プロパティを割り当てる必要があるときに、エンティティを作成し、作成中にナビゲーション プロパティを割り当てていたことです。

// *Goto the data context and create a 'comment' and assign the current user*    

rfcommentcreate.responseFormComment(datacontext.createResponseFormComment(shell.currentUser()));

// *Assign the navigation property back to the current responseForm after creation*

rfcommentcreate.responseFormComment().responseForm(responseForm());
// *Show the modal, while making edits in the modal Knockout is still bound back to the parent properly*

app.showModal(rfcommentcreate).then(function (comment) {
        if (!comment) { datacontext.cancelChanges(); return false; } // If user cancels the dialog cancel changes (actually probably not needed)
        return true;
    });

モーダルを表示してから、渡された responseForm にリンクされたコメントを作成する前に、それが親の Knockout バインディングを壊していたと思います。

于 2013-05-24T15:03:07.583 に答える