2017-09-10 7 views
0

Knockout.jsは、MVVMを実装するのに最適なライブラリです。ドロップダウンの値がバインドされていないのはなぜですか?

以下の最小サンプルは、knockout.jsを使用してグリッドにバインドします。

ビュー

<div id="divDecision"> 
    <div id="divDecisionBinding" data-bind="template: { name: 'tmplDecision' }">/div> 
    <script id="tmplDecision" type="text/x-jquery-tmpl"> 
    <table id="tblDecision"> 
     <thead> 
     <tr> 
      <th>Candidate</th> 
      <th>Decision</th> 
     </tr> 
     </thead> 
     <tbody data-bind="foreach:decisionList" id="tbList"> 
     <tr> 
      <td data-bind="text: candidate"></td> 
      <td> 
      <select data-bind="attr: { id: 'cmbDecision' + ':' + $index(), name: 'cmbDecision' + ':' + $index()}, options: viewModelDecision.decisionLookup, value: 'decision', optionsText: 'decision_desc', optionsCaption: 'Please select'"></select> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    </script> 
</div> 

viewModelDecision(2人のメンバー:decisionLookupとdecisionList)

decisionLookup 
0 : {decision: "N", decision_desc: "No need"} 
1 : {decision: "A", decision_desc: "Approved"} 
2 : {decision: "R", decision_desc: "Rejected"} 
decisionList 
0 : {candidate: "000000001", decision: "A" } 
1 : {candidate: "000000002", decision: "N" } 

スクリプト

var viewModelDecision; 
//viewModelDecision gets loaded from a web service 
viewModelDecision = result; 
//Now the binding happens 
ko.applyBindings(viewModelDecision, document.getElementById("divDecision")); 

回の出力

000000001 Please select 
000000002 Please select 

調査結果

  1. フィールドcandidateが正常にドロップダウンリストcmbDecision:X
  2. オプションは、ドロップダウンリストcmbDecision:Xの値がバインドされていない
  3. を正常にバインドされてバインドされています - キャプション "Please select "がデフォルトで選択されています。

質問ドロップダウンリストの値がデフォルトで選択されていないのはなぜ

答えて

1

valueバインディングは、あなたのビューモデルの観察可能なプロパティをターゲットにする必要があります。

おそらくoptionsValueバインディングを使用して、.decisionに格納されているIDを選択肢として使用するようにknockoutに指示することを意味します。

<select data-bind="options: viewModelDecision.decisionLookup, value: selectedDecision, optionsValue: 'decision', optionsText: 'decision_desc', optionsCaption: 'Please select'"></select> 

し、VM内:

this.selectedDecision = ko.observable("A"); // Pre-select the 2nd item 
+0

私は、部分的にあなたが言っているのか理解しています。しかし、私のviewModelDecisionはWebサービスから来ています - (viewModelDecision = result)。これをもっと明確にするために質問を更新します。 VMでselectedDecisionを設定するにはどうすればよいですか? – Zesty

+0

あなたの答えはoptionsValueの追加と、値の修正: 'decision'を変数に使っていました。私は観察可能な部分を理解することができませんでした。 this.selectedDecisionの設定方法について説明することができれば便利です。 – Zesty

+0

観測値を新しい値で呼び出すことによって観測値を設定します。この値は、選択した項目が正しく更新されるように、リスト内のデシジョン・プロップの1つに対応する必要があります。例:this.selectedDecision(decisionLookup [0] .decision)最初のものを選択します。 optionsValueバインディングは必要ありません。 1つのプロパティではなく、オブジェクトへの実際の参照を格納することもできます。 – user3297291

関連する問題