2014-02-21 27 views
10

我剛開始嘗試knockout.js。 ko.mapping提供了一種從服務器獲取和映射數據的好方法。但是我無法使映射工作。knockoutjs - ko.mapping.fromJS不工作

我有一個簡單的模型:

//var helloWorldModel; 
var helloWorldModel = { 
    name: ko.observable('Default Name'), 
    message: ko.observable('Hello World Default') 
}; 


$(document).ready(function() { 
    ko.applyBindings(helloWorldModel); 
     //a button on the form when clicked calls a server class 
     //to get json output 
    $('#CallServerButton').click(getDataFromServer); 
}); 

function getDataFromServer() { 
    $.getJSON("HelloSpring/SayJsonHello/chicken.json", function(data) { 
    mapServerData(data); 
    }); 
} 

function mapServerData(serverData) { 
    helloWorldModel = ko.mapping.fromJS(serverData, helloWorldModel); 
    alert(JSON.stringify(serverData)); 
} 

的helloWorldModel只有2個屬性 - 這正是我從服務器返回同樣的事情。 mapServerData中的警報顯示 -

{"name":"chicken","message":"JSON hello world"} 

我查找過類似問題的其他帖子,但沒有人似乎解決了這個問題。也許我錯過了一些非常基本的東西 - 想知道是否有人可以指出。

另外請注意,如果我不申報的前期模型,並使用

helloWorldModel = ko.mapping.fromJS(serverData); 

它是正確的數據映射到我的形式。

+2

您也可以寫作這部作品:'函數mapServerData(serverData ){ ko.mapping.fromJS(serverData,{},/ *映射選項的空對象* /,helloWorldModel); alert(JSON.stringify(serverData)); }'看看這裏爲什麼這也會工作:http://stackoverflow.com/questions/13322804/unable-to-parse-bindings-js-error-using-ko-mapping-fromjson-with-parse-exist-vie/13324185#13324185 – nemesv

回答

21

從理查德的回覆,然後對此進行了一些調查,我認爲我初始化模型的方式不正確。我想那個人不能使用現有的視圖模型,然後期望它與mapper插件一起工作。因此,你初始化使用ko.mapping.fromJS生JSON數據視圖模型:

var helloWorldModel; 

$(document).ready(function() { 
    var defaultData = { 
     name: 'Default Name', 
     message: 'Hello World Default' 
    }; 

    helloWorldModel = ko.mapping.fromJS(defaultData); 
    ko.applyBindings(helloWorldModel); 
    $('#CallServerButton').click(getDataFromServer); 
}); 

function getDataFromServer() { 
    $.getJSON("HelloSpring/SayJsonHello/chicken.json", function(data) { 
    mapServerData(data); 
    }); 
} 

function mapServerData(serverData) { 
    alert(JSON.stringify(serverData)); 
    ko.mapping.fromJS(serverData, helloWorldModel); 
} 

此代碼的工作,並提供預期的行爲

+0

很好的答案,並在2.5年後仍然有所幫助。這是我確切的情況。 –

14

您不能通過以這種方式重新分配模型來覆蓋模型。

當你這樣做:

ko.applyBindings(helloWorldModel);

您是說 「綁定模式helloWorldModel頁面」。淘汰賽然後通過並鉤住模型中的觀察對象並將它們與頁面綁定。

現在,當你在這裏覆蓋你的表單模型:

helloWorldModel = ko.mapping.fromJS(serverData, helloWorldModel);

它與在它全新的觀測量一個全新的對象重寫你的模型對象。

要解決它,你需要改變這一行只是:

ko.mapping.fromJS(serverData, helloWorldModel);

這需要在模型內部屬性的照顧和重新分配他們爲你,而不會覆蓋你的模型。

+1

有道理。我更改了我的代碼以刪除作業,但問題仍然存在。 – 6ton

相關問題