2012-08-29 34 views
3

我能够使用以下代码将从.net WebAPI返回的JSON绑定到挖空视图模型。KnockoutJS映射,来自WebAPI的JSON

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当越来越空,当我尝试使用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}] 
+0

能否请您添加JSON从服务器返回。 –

+0

我已经添加了这个。 –

+0

你没有分配任何'data'变量的权利?它甚至没有定义。 – janith

回答

1

你的AJAX调用是异步的,所以它不会立即从你的函数返回你的数据:

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

你可能想传递你想要写结果的可观察/ observableArray给到你的功能,如:

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

然后调用它像:

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

谢谢瑞安,希望你能回答。在做手动映射方面,我应该在获取请求的函数中还是在其他地方执行此操作? –

+0

我个人试图让我的AJAX调用与我的视图模型隔离,并尝试处理那边的普通JS对象。然后,在视图模型方面,我使用了一个构造函数,它接收纯数据并用适当的可观察元素构建它。有很多方法可以做到,但下面是一个示例:http://jsfiddle.net/rniemeyer/Qx4U7/。在这种情况下,您可以测试ViewModel,而不用担心AJAX请求和/或用处理静态数据的“DataClient”替换掉。 –