Knockout JS映射,来自Web API的JSON

时间:2012-08-29 09:28:50

标签: knockout.js asp.net-web-api

我能够使用以下代码将从.net WebAPI返回的JSON绑定到knockout viewmodel。

function viewModel() {
    var self = this;
    self.temps = ko.observableArray([]);
}

$(function () { 
    var model = new viewModel();

    $.get('../api/Temp/', function (data) { 
        model.temps(data);
    });

    ko.applyBindings(model);       

});

当我尝试使用Ryan Niemeyer 's mapping example时,在我返回的Json上使用ko.utils.parseJson时我得到null,当我尝试直接使用ko.utils.arrayMap时,我得到了未定义。

如果我尝试以下操作,我也在努力将get请求带入一个单独的函数,我的数据绑定停止工作

function dataFromServer() {
    $.get('../api/Temp/', function (data) { 
        return data;
    });
}

$(function () { 
    var model = new viewModel();
    var data = dataFromServer();
    model.temps(data);

    ko.applyBindings(model);       

});

从服务器返回JSON:

[{"Id":1,"Name":"Test1","TypeId":100,"Temp":21.0,"Peak":true},{"Id":2,"Name":"Test2","TypeId":100,"Temp":21.0,"Peak":true},{"Id":3,"Name":"Test3","TypeId":101,"Temp":21.0,"Peak":true}]

1 个答案:

答案 0 :(得分:1)

您的AJAX调用是异步的,因此它不会立即从您的函数返回您的数据:

$.get('../api/Temp/', function (data) { 
        return data;
    });

您可能希望将要将结果写入的observable / observableArray传递给函数,如:

function dataFromServer(temps) {
    $.get('../api/Temp/', function (data) { 
        return temps(data);
    });
}

然后称之为:

var model = new viewModel();
dataFromServer(model.temps);