2012-03-02 11 views
2

私はknockoutjsのviewmodelを持っている:外部jquery .ajax呼び出しからビューモデルのobservableArrayを参照するにはどうすればよいですか?このように定義された

function TestViewModel() { 
    var self = this; 
    self.matches = ko.observableArray([]); 
    self.selectedItem = ko.observable(self.matches()[0]); 
    self.SelectMatch = function (match) { 
     self.selectedItem(match); 
    }; 
    self.setMatchList = function (_data) { 
     self.matches(_data); 
    }; 
} 

私はまた、ストレートJavaScriptを使用して、クリックイベントから呼び出される機能がある - なしknockoutjsデータバインディング関与を。スクリプトは、そのように、サーバからのJSON配列をretreives:

 $.ajax({ 
     type: 'post', 
     contentType: "application/json; charset=utf-8", 
     url: "/FindMatches", 
     timeout: 10000, 
     data: JSON.stringify({ firstname: $("#Person_ProperFirstname").val(), lastname: $("#Person_ProperLastname").val(), gender: $("#Person_Gender").val().substring(0, 1) }), 
     success: function (results) { 
      if (results.length < 1) { 
       //setErrorMessage("No matches were found."); 
      } 
      else { 
       //setErrorMessage(""); 
       $.each(results, function (item) { 
        TestViewModel.matches.push(item); 
       }); 
       $("#parent_dialog").dialog("open"); 
      } 

は、今私は、サーバーから返された結果と私のviewmodel上の一致をobservableArray更新したいが、私はこれを行う方法を考え出すのトラブルを抱えています。あなたは上記のスクリプトで何を参照してくださいに加えて、私も次のことを試してみた:

else { 
    TestViewModel.matches(results); 
} 
//also this 
else { 
    TestViewModel.setMatchList(results); } 

任意の助けいただければ幸いです。

答えて

3

私はあなたのコードは次のような行を使用してのKOバインディングを初期化することを想定しています:

ko.applyBindings(new TestViewModel(data.d));

を、あなたのモデルのインスタンスの変数を作成する場合は、あなたが他のコードでそれを参照することができ。

var _tvm = new TestViewModel(data.d); 
ko.applyBindings(_tvm); 

その後、あなたのAjaxの結果はこのようなものだろう:これは、正確に右ではないかもしれませんが、あなたは閉じて取得する必要

else { 
    _tvm.matches(results); 
} 

を...

0

私はデータがオブジェクトだと思いますそれを配列にする必要があります。

$.getJSON('/casestudies', function(data) { 
    vm.casestudies = ko.mapping.fromJS(data); 
    ko.applyBindings(vm); 
}); 
エルス

、あなたの例のために、手動でマッピングを行う必要があるでしょう:私は私のために簡単に変換を行うためにmapping pluginを使用しました

 $.each(results, function (item) { 
      TestViewModel.matches.push(item); 
     }); 

上記項目がありますまだオブジェクトなので、アイテムのプロパティをforeachしてkoのモデルにマップする必要があります。ko's json page

// Load and parse the JSON 
var someJSON = /* Omitted: fetch it from the server however you want */; 
var parsed = JSON.parse(someJSON); 

// Update view model properties 
viewModel.firstName(parsed.firstName); 
viewModel.pets(parsed.pets); 
関連する問題