2017-04-05 12 views
0

から選択された値が、私はオートコンプリートから選択された値(JSON)のリストを維持する必要があり、配列を持っていたマッピングに関するいくつかの基本的なもの、observableArrayと私は最後の数年の間にknockoutjsでは動作しませんでしたautocomplate

を忘れてしまいました 私は次のコードを作成しました:私は私の選択を参照して、結果として

define(['jquery', 'knockout', 'koAutocomplete', 'mapBase','app/obj/routePoint'], 
    function ($, ko, koAutocomplete, mapBase, routePoint) { 
    return function routeBuilder() { 
     var self = this; 
     mapBase.initMap(); 
     self.rootPoints = ko.observableArray([new routePoint()]); 
     self.addNewPoint = function() { 
      self.rootPoints.push(new routePoint()); 
     }; 
     self.removePoint = function() { 
      self.rootPoints.remove(this); 
     }; 
     self.getOptions = function(searchTerm, callback) { 
      $.ajax({ 
       dataType: "json", 
       url: "/api/Geocoder", 
       data: { 
        query: searchTerm 
       }, 
      }).done(function (results) {     
       callback(mapBase.convertToAutoComplate(results)); 
      }); 
     } 
    }; 
}); 

// Main viewmodel class 
define(['knockout'], 
    function (ko) { 

     return function routePoint(label, locationId) { 
      var self = this;  
      self.label = label; 
      self.locationId = locationId; 
      self.selectedData = ko.observable(); 
    }; 
}); 

<ul data-bind="foreach: { data: rootPoints, as: 'point' } "> 
    <li> 
     Name at position <span data-bind="text: $index"> </span>: 
     <input placeholder="Start Type Name" 
       data-bind="jqAuto: { 
       value: $data.selectedData().label, 
       valueProp: '$data, 
       source: $parent.getOptions, 
       dataValue: $data, 
       inputProp: 'label', 
       labelProp: 'label', 
       options: { minLength: 3 } }" /> 
     <a href="#" data-bind="click: $parent.removePoint">Remove</a> 
    </li> 
</ul> 

、UIしかしrootPointsアレイ自制空の値にします。 選択したオブジェクトを特定の配列インデックスにマップする方法はありますか?

+0

mapBase.convertToAutoComplateとは何ですか? –

+0

@JasonSpake routePointオブジェクトリスト –

+0

その関数にブレークポイントを置くとヒットしますか? –

答えて

0

jqAutocompleteライブラリを使用しているようです。 documentationから:

DataValueは - 指定された場合は、この観測可能では 現在選択されているデータ項目が設定されます。このオプションを使用すると、 の値をvaluePropに設定し、dataValueを通じて同じ時間に に選択したオブジェクトにアクセスできます。

したがって、選択したオプションにアクセスするには、それを保存するために観測可能なプロパティが必要です。次に、その観測値をdataValueバインディングに渡します。私はあなたが親のビューモデルで新しい観測可能性を作り、それを使うためにバインディングオプションを変更する必要があると思います。

return function routeBuilder() { 
    var self = this; 
    mapBase.initMap(); 
    self.rootPoints = ko.observableArray([new routePoint()]); 
    self.selectedPoint = ko.observable(); 
...  

<input placeholder="Start Type Name" 
     data-bind="jqAuto: { 
      source: $parent.getOptions, 
      dataValue: $parent.selectedPoint, 
... 
+0

はい、あなたは正しいですが、私はrootPointsポイントでself.selectedDataを持っている必要があります。私は配列内にN個の要素を持ち、それぞれを選択する必要があります。あなたが見ることができるように、私はforeachを見ている –

+0

私はその財産が何かのために使用されていたことを認識していませんでした。今はどう? selectedpointと呼ばれる新たなオブザーバブル –