2

セットアップは次のとおりです。

ユーザーはページ「A」にいます。ナビゲーションに使用されるドロップダウン (DROPDOWN) があります。ユーザーが選択できるオプションは、A、B の 2 つです。A は現在のページを表し、B はユーザーが移動したいページを表します。

このドロップダウンは、そのドロップダウンの状態を保持する別の通常のオブザーバブル (TARGET) を読み取ることができ、書き込むこともできない場合もある従属オブザーバブル (GUARD) にバインドされます。

ドロップダウン <-- --> ガード <-- ?--> ターゲット

アイデアは、ユーザーがドロップダウンで何かを選択してページから移動した場合、最初に未保存の変更があるかどうかを確認し、保存されていない変更がある場合は、それらを破棄するか、ページにとどまって編集を続けるかをユーザーに尋ねるというものです。 .

状況: 保存されていない変更があります。ユーザーはドロップダウンから何かを選択します。GUARD は、その「書き込み」メソッドが呼び出されることによって開始されます。変更を破棄してページから移動するか、留まるかをユーザーに確認します。ユーザーは滞在を選択します。「問題ありません」と言い、書き込みメソッドは何もしないので、ターゲットのオブザーバブルはそのまま残ります。話の終わり!しかし..

ユーザーがドロップダウンに触れ、「変更」さえキャンセルされなかったため (バインドされたオブザーバブル内でそれを行う手段はありません)、ユーザーがページから移動することを選択したかのように、ドロップダウンは「B」の状態になりました。

だから私の質問は簡単です:

  • ドロップダウンがバインドされている依存オブザーバブルの「書き込み」メソッド内から「変更」イベントをキャンセルする方法はありますか?

  • いいえの場合、ドロップダウンの選択を TARGET オブザーバブルと同期させたまま、この状況から抜け出すにはどうすればよいですか?

4

1 に答える 1

2

'change'イベントは、ドロップダウンが既に変更されたに発生するため、簡単な解決策は、への呼び出しで簡単に実行できる、古い値を使用してドロップダウンを「更新」することtarget.valueHasMutated()です。フィドルの例:http://jsfiddle.net/KXhem/77/

編集:ノックアウト3以降、calculatedは値が実際に変更された場合にのみ通知します。同じ動作を得るには.extend({ notify: 'always' })、計算に追加できます。詳細については、こちらをご覧ください:http: //knockoutjs.com/upgrade-notes/v3.0.0.html

于 2012-10-24T23:14:10.047 に答える