1

http://jsfiddle.net/CsrrD/

与えられたオブジェクト

var viewModel = {
    Opts: ko.observableArray([
    { d: 'a', v: 0, selected: 1},
    { d: 'b', v: 1, selected: 1},
    { d: 'c', v: 2, selected: 1},
    { d: 'd', v: 3, selected: 2},
    { d: 'e', v: 4, selected: 1},
    { d: 'f', v: 5, selected: 1}
    ]), 
    selectedOpts: ko.observableArray([])
};

複数選択リストをバインドして、「選択された」プロパティの値を変更したいと考えています。1 は false、2 は true です。(サーバー上での表示方法 - 実際にはステータス コードです)

<select data-bind="options: Opts,
    optionsText: 'd',
    optionsValue: 'v',
    selectedOptions: selectedOpts,
    optionsCaption: 'Choose...'" multiple=""></select>

selectedOptions バインディングを選択されたプロパティにバインドできれば、selectedOpts オブジェクトは必要ないことはわかっています。値のリストを表示するために selectedOpts への手動サブスクリプションを設定せずに手動でこれを行う方法がわかりません。選択された各項目に選択されたプロパティを設定します。

簡単な方法があると確信しています。

ありがとう

4

2 に答える 2

2

あなたが望むことを自動的に行う方法は実際にはありません。

いくつかのオプションがあります:

  • あなたが示したように、observableArrayへの手動サブスクリプションをセットアップし、オプションをループして、配列内にあるかどうかに基づいて値を設定します
  • オプションを作成して、selectedそれが配列内にあるかどうかに基づいてそれ自体を更新し続ける計算されたオブザーバブルになるようにします。欠点は、observableArray が更新されるたびに起動する計算済みのオプションが各オプションにあることです (単一の手動サブスクリプションよりも効率的ではありません)。
  • selectedOptionsを探し、バインディングでサブスクリプションを実行するカスタム バインディングを記述します。たぶん、次のような各オプションで実行する関数を提供するでしょう: http://jsfiddle.net/rniemeyer/ds2aE/
于 2012-06-13T13:46:09.813 に答える
0

手動サブスクリプションはそれほど怖くなく、非常に便利です。選択したプロパティを監視可能にするだけでこれがいかに簡単に達成できるかを示すために、フィドルを変更しました。

http://jsfiddle.net/CsrrD/4/

設計の観点からのヒントですが、サブスクリプション関数はおそらく viewModel オブジェクトに存在する必要があり、手動で観察可能な作成を避けるためにマッピング プラグインを使用することをお勧めしますが、アイデアは理解できます。

于 2012-06-13T13:55:53.350 に答える