0

ノックアウトマッピングプラグインを使用しようとしていますが、UIにデータがバインドされていません。以下は私のコードです:

var model;

$(document).ready(function () {
$.ajax({
    type: "POST",
    url: SERVER_PATH + '/jqueryservice/DataAccessService.asmx/GetData',
    async: false,
    data: "{ }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result, status) {
        model = ko.mapping.fromJS(result.d);
    },
    error: GetDataError

});

 });

 function GetDataError() {
     alert("System is not responding at the moment. Please try again.");
 }

誰かが私がここで間違っていることを教えてもらえますか?サーバーから返されるデータは次のとおりです。

{"ID":903,"Name":"Camela Holding","Email":"Camelah@yahoo.com",
   "Vehicles":[{"ID":1,"Name":"Van"},
               {"ID":2,"Name":"Car"},
               {"ID":4,"Name":"Cadillac"},
               {"ID":5,"Name":"Train"},                         {"ID":3,"Name":"Jeep"}],
   "OwnerVehicle":0,"WeeklyData":null,"Week1":null}
4

2 に答える 2

0

さて、これが私たちの質問に対する答えです-

これを試して

var model  = ko.observable();
$(document).ready(function () {
$.ajax({
      type: "POST",
      url: SERVER_PATH + '/jqueryservice/DataAccessService.asmx/GetData',
      async: false,
      data: "{ }",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
success: function (result, status) {
    model(ko.mapping.fromJS(result.d)()); //mapped using braces ()
},
error: GetDataError

   });

 });

ここでの唯一の違いは、model = ko.mapping.fromJS(result.d)); の代わりにモデルを監視可能にしたことです。model(ko.mapping.fromJS(result.d)()); を使用しました。

JSONオブジェクトを配列にマッピングする代わりに、オブザーバブルをマッピングしています.すべてのオブザーバブルが関数になり、それらの値がこれらのブレース「()」のような関数を使用してアクセスされることに注意する必要があります.

この理由だけで、それを別の変数に入れて中括弧を使用してアクセスしたときに機能していました。

于 2015-06-25T12:21:11.943 に答える
0

私はこの修正を同様の状況で機能させることができましたが、なぜ、どのように機能しているのか正確な理由はわかりません。

ノックアウト マッピング プラグインを使用して、オブザーバブルを配列である AJAX 応答にバインドしようとしていました。

これは私が最初にやっていたことです:

   self.DataRows = ko.observableArray();
   $.ajax({
                url: '/Home/GetStudentList1',
                cache: false,
                type: 'post',
                data: self.GridParams,
                success: function (data) {                        
                    self.DataRows(ko.mapping.fromJS(data));
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.log("error :" + XMLHttpRequest.responseText);
                    alert('There was an error in performing this operation.');
                }
            });

データはオブザーバブルにマップされていましたが、UIが更新されていなかったので、これを試しました

   $.ajax({
                url: '/Home/GetStudentList1',
                cache: false,
                type: 'post',
                data: self.GridParams,
                success: function (data) {
                    var observableData = ko.mapping.fromJS(data);
                    self.DataRows(observableData());
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    console.log("error :" + XMLHttpRequest.responseText);
                    alert('There was an error in performing this operation.');
                }
            });

唯一の違いは、オブザーバブルにマッピングする前に変数に入れたということです。
同様に、あなたの場合、次のようなことを試してみるべきだと思います:

var self = this; //save reference to this as you will it in ajax success
self.model = ko.observable(); //create your observable
 $.ajax({
            type: "POST",
            url: SERVER_PATH + '/jqueryservice/DataAccessService.asmx/GetData',
            async: false,
            data: "{ }",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
        success: function (result, status) {
                 var data = ko.mapping.fromJS(result.d);// don't have any idea what is making knockout happy doing it this way?
                 self.model(data());
    },
        error: GetDataError

    });

console.log(DataRows()) を実行していたときの両方のケースで、オブザーバブルの構造は同じでした。

于 2015-06-18T10:38:34.730 に答える