2017-01-11 9 views
0

次のjquery-uiオートコンプリートリストを表示するカスタムバインドハンドラを作成しました。要素を選択した後、私はoptions.valueによって与えられた与えられた観測可能な値を変更したいが、select関数が入ったときは変更はない。 1カスタムハンドラ内で観測可能なモデルを変更する

ko.bindingHandlers.autocomplete = { 
    init : function(element, valueAccessor, allBindings, viewModel, bindingContext) { 

     var options = ko.unwrap(valueAccessor());    

     $(element).autocomplete(
       { 
        minLength : 2, 
        autoFocus : true, 
        source : function(request, response) { 
         $.ajax({ 
          url : options.source, 
          data : { 
           term : request.term 
          }, 
          dataType : "json", 
          type : "GET", 
          success : function(data) { 
           response(data); 
          } 
         }); 
        }, 
        select : function(event, ui) { 
         var selectedItem = ui.item; 
         options.value(selectedItem.name); 
        } 
       }); 
    } 
}; 

<input data-bind="autocomplete: { 
    value: myView().parent_name, 
    source: '/data/autocomplete' 
}" 
type="text" class="form-control"> 

編集は私がコメントから結合を試みたが、私はまだ問題があります。

model.autocomplete = function(searchTerm, callback){ 
    $.ajax({ 
     type : "GET", 
     url : "/data/autocomplete", 
     data: {term: searchTerm} 
    }).done(callback); 
}; 

入力は次のようになります。

<input data-bind="jqAuto: { 
     value: myView().parent_name, 
     source: myView().autocomplete, 
     labelProp: 'name', 
     valueProp: 'parent_name' 
    }" 
    type="text" class="form-control"> 

これはMYVIEWを()は変更されません

編集2

をPARENT_NAME私は今いただきました!問題を知っていると思います。

<!DOCTYPE html> 
<html> 
<body> 
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script> 
<script src="https://rawgit.com/rniemeyer/knockout-jqAutocomplete/master/build/knockout-jqAutocomplete.js"></script> 

<h1>Testpage</h1> 
<input data-bind="jqAuto : { 
     source: sub().autocomplete, 
     value: sub().id, 
     labelProp: 'name', 
     valueProp: 'id' 
    }"></input> 
<button data-bind="click: sub().output">ok</button> 
<button data-bind="click: reset">reset</button> 

<script> 
function getData() { 
    var data = [ 
     { 
      name: "Test1", 
      id: 1 
     }, 
     { 
      name: "Test2", 
      id: 2 
     },{ 
      name: "Test3", 
      id: 3 
     }  
    ]; 
    return data; 
} 

function Submodel() { 
    var self = this; 

    self.name = ko.observable(""); 
    self.id = ko.observable(null); 

    self.autocomplete = function(searchTerm, callback) { 
     callback(getData()); 
    }; 

    self.output = function(){ 
     alert(self.id()); 
    }; 
} 

function PageModel() { 
    var self = this; 

    self.sub = ko.observable(new Submodel()); 

    self.reset = function(){ 
     self.sub(new Submodel()); 
    }; 
} 

ko.applyBindings(new PageModel()); 
</script> 

</body> 
</html> 

いくつかの点でクリアが、これは結合無効に思われるサブモデルがあります:私はこの1つのようにはるかに簡単なテストファイルを作りました。私がリセットボタンを押すまで、すべて正常に動作します。リセット後にバインディングを更新する方法はありますか?ダイアログのバインディングを使わずに、すべての変数を手作業でクリーニングせずに、モデルでダイアログを使いたいので、このリセットが必要です。

+0

あなたが車輪の再発明していないことを確認してください:https://github.com/rniemeyer/knockout-jqAutocomplete – user3297291

+0

今、あなたが結合jqAutocompleteを試したこと:私たちを見ます'myView' viewmodelと' parent_name'と 'name'は何ですか? – user3297291

+0

myModel()が唯一定義しているのは、現時点ではparent_name = ko.observable(null)です。私はjqAutoのコードを調べましたが、これはparent_nameの代わりにjsonノード全体に適用されると思われます – Gustavo

答えて

1

あなたが提供した(最小限の)コードと私の質問に対するコメントに基づいて、私は実際の例を示すことで助けになるかもしれません。

最も重要なの持ち帰り:

  • あなたはvaluePropinputProplabelProp間の違いを読んでする必要があります:彼らはあなたがしたいものをあなたのviewmodels対をして店にあなたが望むものを定義するために使用されていますユーザーに表示それは私が「
  • 醜いですので、私は、CSSが含まれていませんでした

    • :必ずデータごautocompleteメソッドの戻りを作る
    • あなたが例を試してみ

    ノートを指定小道具を持っています例のデータとして文字列"one""ten"を使用しました。 oまたはeまたはこれらの言葉で使用されている他の文字を入力してください。

var Model = function() { 
 
    return { 
 
    parent_name: ko.observable(null), 
 
    autocomplete: function(searchTerm, callback) { 
 
     setTimeout(function() { 
 
     callback(getData().filter(function(v) { 
 
      return v.name.includes(searchTerm.toLowerCase()) 
 
     })); 
 
     }, 200); 
 
    } 
 
    }; 
 
}; 
 

 
var vm = { 
 
    myView: ko.observable(new Model()), 
 
    reset:() => vm.myView(new Model()) 
 
}; 
 

 
ko.applyBindings(vm); 
 

 
function getData() { 
 
    return ["one", "two", "three", "four", 
 
      "five", "six", "seven", "eight", 
 
      "nine", "ten"] 
 
     .map(str => ({ name: str })); 
 
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script 
 
    src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js" 
 
    integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" 
 
    crossorigin="anonymous"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<script src="https://rawgithub.com/rniemeyer/knockout-jqAutocomplete/master/build/knockout-jqAutocomplete.js"></script> 
 

 
<p> 
 
    <code>parent_name</code>’s value is: 
 
    <strong> 
 
    <code data-bind="text: JSON.stringify(myView().parent_name())"></code> 
 
    </strong> 
 
</p> 
 

 

 
<!-- ko with: myView --> 
 
<input data-bind="jqAuto: { 
 
     value: parent_name, 
 
     source: autocomplete, 
 
     labelProp: 'name', 
 
     valueProp: 'name' 
 
    }" type="text" class="form-control"> 
 
<!-- /ko --> 
 

 
<button data-bind="click: reset">reset</button>

+0

今、私はjqAutocompleteのデバッグを開始しました。 config.selectコールバックにoptions.value(ui.item.actual)を呼び出します。ここでactualは選択した値ですが、observableは設定されていません。 – Gustavo

+0

あなたは「観察可能なものは設定されていません」と言っている以上のことを私に見せなければならないでしょう...私はこれを再現することができないので、おそらく他の場所で何か間違っているでしょう... – user3297291

+0

私の投稿を例。 – Gustavo

関連する問題