2012-04-20 5 views
3

私はKnockout.jsをかなり新しくしているので、これは愚かな質問かもしれません。ノックアウトビューモデルに既存の選択オプションをバインドする

私はBindingsのドキュメント、特にoptions bindingを読んでいます。これは、バインディングを適用するときに言います:

以前のオプションは削除されます。

既存のオプションを保持する方法はありますか?

<select data-bind="options: availableOptions, optionsText: 'name', value: selectedOption"> 
    <option value="1">One</option> 
    <option value="2" selected>Two</option> 
</select> 

<script type="text/javascript"> 
    var option = function(name, value) { 
     this.name = name; 
     this.value = value; 
    }; 
    var viewModel = { 
     availableOptions : ko.observableArray([]), 
     selectedOption : ko.observable() 
    }; 
</script> 
+3

いいえ、それらを保存する簡単な方法はありません。しかし、利用可能なオプションを分割することは、とにかく良い考えではありません。データ全体をビューモデルやビューに入れても、それを混ぜないでください。なぜこの "機能"が必要ですか?たぶん、より良い/クリーンな方法があります。 – Niko

+0

私の主な関心事はパフォーマンスです。すでにレンダリングされているものを使用する代わりに、動的に100個のアイテムを追加することは良いアイデアのようには見えません。特にモバイルのような低電力シナリオでは。 – DreamSonic

+0

問題が発生したときにパフォーマンスが気になるかもしれません...さらに、選択ボックス内の100個のアイテムはまったく理想的ではありません。 –

答えて

6

Nikoの提案に基づいて、静的データとの宣言的バインディングを混同しないようにしてください。ビューが変更されにくい場合は、データをビューに配置します(selectのオプション要素)。動的な場合は、データをKOビューモデルに入れます。

私のシナリオでは、かつてのだ:

<select data-bind="value: selectedOption"> 
    <option value="1">One</option> 
    <option value="2" selected>Two</option> 
</select> 

<script type="text/javascript"> 
    var viewModel = { 
     selectedOption : ko.observable() 
    }; 
</script> 
0

どのバックエンドをお使いですか?既存のすべてのオプションをjsonオブジェクトに入れて、ビューモデルをhttp://knockoutjs.com/documentation/plugins-mapping.htmlで埋めることをお勧めします。

+1

ここではバックエンドは問題ではありません。これは純粋にクライアント側の問題です。 (私はASP.NET MVC3を使用しています) – DreamSonic

+0

.netまたはrubyを使用していたかどうかを知りたかったのです。 json.net http://json.codeplex.com/を使用してjsonオブジェクトを作成し、ビューモデルを作成します。それはあなたの選択リストに必要な方法で動作します。 –

+0

ジェイソンの指摘は、これを行う別の方法があると思います。サーバーからオプションを提供することで、静的であるかどうかを気にすることなく、ビューはダムになり、指定されたオプションだけが表示されます。ビューモデルは、これらのオプションに対しても同様に動作します。その後、これらのオプションを変更する必要がある場合は、サーバー側のコードだけで変更する必要があります。 –

関連する問題