2017-04-11 7 views
0

knockoutJsでselect入力ドロップダウンを処理していますが、knockoutJsでdata-bind = withを使用するとOption値が空です。誰も私にこれを手伝うことができますか?knockoutJsでdata-bind = withを使用すると、オプション値が空になる

今ではすべてが正常に動作しているまで、HTML

<p data-bind="with: preferedTimeToPickupVal"> 
<span data-bind="text: name"></span> 
</p> 
<p data-bind="with: preferedTimeToPickupVal"> 
<span data-bind="text: price"></span> 
</p> 

の下に使用してデータを表示する

Dropdown.html

<span class="price"><select data-bind="options: preferedTimeToPickup,optionsCaption: 'Dont Know or Does not Matter', 
    optionsText: 'name',value: preferedTimeToPickupVal" id="u3413_input" ></select> 
    </span> 

Custom.js

this.preferedTimeToPickup = 
    [{name:"Morning (8-11)",price:5}, 
    {name:"Lunch (11-2)",price:6}, 
    {name:"Afternoon (2-5)",price:7}, 
    {name:"Specific: 8:00",price:8.5}, 
    {name:"Specific: 9:00",price:9.5}, 
    {name:"Specific: 10:00",price:10.25}, 
    {name:"Specific: 11:00",price:11.25}, 
    {name:"Specific: 12:00",price:12.25}, 
    {name:"Specific: 1:00",price:13.25}, 
    {name:"Specific: 2:00",price:14.25}, 
    {name:"Specific: 3:00",price:15.25}, 
    {name:"Specific: 4:00 (closed at 4 on sat)",price:16.25}]; 

    this.preferedTimeToPickupVal = ko.observable(); 

が、選択ドロップでにoptionsValue: 'name'を使用すると、value=""が空になりますの場合、値はうまく表示されますが、データを表示する場所ではdata-bind="with: preferedTimeToPickupValが機能しません。

ご協力いただければ幸いです。

+0

ノックアウトを使用する場合、 'document.getElementById( 'id')。value'に依存しないでください。 'value'バインディングは文字列だけでなく、(' with'バインディングを持つ部分をサポートしているので)あなたの状況では非常に便利です。良い方法:他の場所で 'value'が必要な場合は、ビューモデルにリンクします。悪い習慣:少なくとも、 "ko.dataFor(element).preferedTimeToPickupVal()。price"を使って、選択した価格をDOMから取得する。 – user3297291

答えて

0

optionsValue: priceを追加し、pureComputedを使用すると、選択した値に基づいて適切な情報が得られます。

function viewModel() { 
 
    var self = this;  
 
    self.preferedTimeToPickup = [ 
 
    {name:"Morning (8-11)",price:5}, 
 
    {name:"Lunch (11-2)",price:6}, 
 
    {name:"Afternoon (2-5)",price:7}, 
 
    {name:"Specific: 8:00",price:8.5}, 
 
    {name:"Specific: 9:00",price:9.5}, 
 
    {name:"Specific: 10:00",price:10.25}, 
 
    {name:"Specific: 11:00",price:11.25}, 
 
    {name:"Specific: 12:00",price:12.25}, 
 
    {name:"Specific: 1:00",price:13.25}, 
 
    {name:"Specific: 2:00",price:14.25}, 
 
    {name:"Specific: 3:00",price:15.25}, 
 
    {name:"Specific: 4:00 (closed at 4 on sat)",price:16.25} 
 
    ]; 
 

 
    self.selectedPrice = ko.observable("");  
 

 
    // use this to get the selected value object and show it on the view 
 
    self.preferedTimeToPickupVal = ko.pureComputed(function() { 
 
    if(self.selectedPrice() !== "") 
 
     return ko.utils.arrayFirst(self.preferedTimeToPickup, function(time) { 
 
     return self.selectedPrice() === time.price; 
 
     }); 
 
    return null; 
 
    }, this); 
 
} 
 

 
ko.applyBindings(new viewModel());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<span class="price"> 
 
    <select data-bind="options: preferedTimeToPickup,optionsCaption: 'Dont Know or Does not Matter', 
 
optionsText: 'name', optionsValue: 'price', value: selectedPrice" id="u3413_input" ></select> 
 
</span> 
 

 
    <p data-bind="with: preferedTimeToPickupVal"> 
 
    <span data-bind="text: name"></span> 
 
    </p> 
 
    <p data-bind="with: preferedTimeToPickupVal"> 
 
    <span data-bind="text: price"></span> 
 
    </p>

+1

** 'if'バインディングで' with'をラップする必要はありません**。 'with'バインディングは、偽の値を完全にうまくサポートします。私はあなたに助力をしていただきありがとうございますが、あなたはもう少し慎重に "多分それは..."と答えるでしょう:)もしあなたが提供されたコードの何が間違っているのか分からないなら、 。 – user3297291

+0

答えをありがとう、それは正常に動作していますが、この例ではvalue = ""が空で表示されていますが、私の場合は同じ問題に直面しています。いくつかの機能のために、私は "Id"で値をレンダリングする必要があります。 –

+1

@ user3297291フィードバックありがとう: – muhihsan

1

Your code正常に動作し、あなたが正しくthisを使用していることを確認してください。

var vm = function() { 
    this.preferedTimeToPickup = [{ 
     name: "Morning (8-11)", 
     price: 5 
     } 
     //... 
    ] 

    this.preferedTimeToPickupVal = ko.observable() 
} 
ko.applyBindings(new vm()); 

編集

[OK]を、私は私はあなたが欲しいものを理解すると思います。 my updated fiddleをご覧ください。あなたはselectタグ内のすべてのノードoptionためvalue属性を持つようにしたい場合は

は基本的に、あなたはバインディングoptionoptionsValue: 'name'オプションを使用する必要があります。

このようにすると、オブジェクト全体ではなくオブジェクトのnameプロパティが保存されるようになります。選択した値に一致する配列内の正しいオブジェクトを取得する方法を見つける必要があります。

これを行うには、選択範囲を保持する一時変数と、選択が変更されたときに配列をフィルタリングして正しいオブジェクトを取得する計算対象オブザーバブルを生成することができます。

<span class="price"><select data-bind="options: preferedTimeToPickup, 
    optionsCaption: 'Dont Know or Does not Matter', 
    optionsValue: 'name', 
    optionsText: 'name', 
    value: _preferedTimeToPickupVal" id="u3413_input" ></select> 
</span> 

var vm = function() { 
    this.preferedTimeToPickup = [ {}, {} ] 
    this._preferedTimeToPickupVal = ko.observable(); 
    this.preferedTimeToPickupVal = ko.pureComputed(function() { 
     var selectedVal = this._preferedTimeToPickupVal() 
     var defaultVal = { price: null, name: null } 
     var found = null 
     if (selectedVal) { 
     found = this.preferedTimeToPickup.filter(function(i) { 
      return i.name === selectedVal 
     }) 
     } 
     return found && found[0] ? found[0] : defaultVal 
    }, this) 
} 
+0

答えをありがとう、それは正常に動作していますが、値= ""空を表示して、私は私の場合に同じ問題に直面している。いくつかの機能のために、私は "Id"で値をレンダリングする必要があります。 –

+0

ノックアウトは、選択が実際のオブジェクト参照であるため、 'value'属性をバイパスします。文字列ではありません。 'optionsValue'を使うとうまくいきますが、あなたの選択を再計算する必要があります。最終的に、DOMを通じて 'value'属性にアクセスする必要があるのは、ノックアウトアーキテクチャーのガイドラインに従わないというサインです。 – user3297291

+0

わかりました。 2つの事柄をセットアップする必要があります。選択肢の値を格納する一時変数と、選択項目が更新されたときに配列をフィルタリングする計算されたobservableです。私の更新フィドルを見てください – cl3m

関連する問題