2012-10-25 18 views
6

ノックアウトで複数の選択フィールドとして使用するカスタムバインディングを作成しようとしています。例: 請求書レポートの選択画面を設計します。この選択画面では、項目 '請求書タイプ'を使用して、ユーザーが請求書のタイプのみを提供できるようにしたいと考えています。このフィールドに標準テキストボックスを使用すると、1つの請求書タイプ。私はそれらが選択において複数のタイプを提供できるようにしたい。 私の考えを準備した結合のような:私はフィールドを提供することができノックアウトjsの複数選択のカスタムバインディング

// html 
<input data-bind="multiple: { data: optionsArray }" /> 
... 
// view model 
optionsArray = ko.observableArray(); 

「optionsArray」、(複数の請求書の種類になります私の場合は)ユーザーの複数の一品を開催します。 UIに関しては、このように見えると思っていました。複数のバインディングを持つ要素の隣にボタンがあります。クリックすると、ダイアログウィンドウが表示され、そこにすべてのoptionsArray要素が表示され、変更できます。新しい要素を追加または削除できます。

ダイアログボックスのすべてのoptionsArray要素をオブザーバブルとして編集できず、すべての変更がviewModel.optionsArrayに反映されないため、これを実現する方法がわかりません。これも可能ですか?

カスタムバインディングを作成した経験がありますか?

答えて

5

custom bindingを作成する必要はありません。 selectedOptionsバインディングを使用することができます。ここにはドキュメントへのリンクがあります:http://knockoutjs.com/documentation/selectedOptions-binding.html。ダイアログを例に作業して、新しいオプションが追加される。ここ

<select data-bind="options: optionsArray, selectedOptions: selectedTypes" size="5" multiple="true"></select> 

http://jsfiddle.net/vyshniakov/nZtZd/

+0

これは良いですが、セレクションt要素はあまりスタイリッシュではなく、各項目を編集したいと思っています。 – Eori

+2

@Eori何ですか? select要素は、ネイティブのHTML要素です。CSSによって、他のすべてのHTML要素と同じレベルにスタイル設定することができます。 – Tyrsius

+0

ネイティブのマルチセレクトは非常に恐ろしいですが、スタイリングはこれまでのところあなたを得るだけです。多くのアプリでは、テキスト領域に追加できる項目のドロップダウンがあります。時には、これは隠されたマルチセレクトで行われ、セレクションをサーバーに渡します。これはノックアウトが優れているべきものです。 –

0
ko.bindingHandlers.multiple = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     $(element).change(function() { 
      var actualValueArray = $(this).val().split(","); 
      valueAccessor(actualValueArray); 
     }); 
    }, 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var valueArray = valueAccessor(); 
     var valueArrayUnwrapped = ko.utils.unwrapObservable(value); 
     // Join all invoice numbers using comma 
     $(element).val(valueArrayUnwrapped.join(", ")) 
    } 
}; 
multiselect

self.optionsArray = ko.observableArray(); 
self.selectedTypes = ko.observableArray(); 

を、バインド:

ビューモデルにoptionsArrayselectedTypes観察可能な配列を追加します。

+0

これは、すべての配列要素を取り出して表示するだけです。私はそれぞれの配列要素を異なる入力要素にバインドするために、それらを編集可能にするためにバインドしたいと思います。 – Eori

+0

この場合、編集可能なグリッドの例http://knockoutjs.com/examples/gridEditor.htmlで説明されているようなカスタムバインディングではなく、テンプレートを作成してください。 – STO

+0

いいえ、1つのビューに20個のフィールドがある場合、それは多くのコードです。それを拘束力として持つことは、もっときれいで清潔です。 – Eori

関連する問題