2012-08-29 31 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」替換掉。 –