私はknockout.jsを試し始めたところです。 ko.mappingは、サーバーからデータを取得してマップするための優れた方法を提供します。ただし、マッピングを機能させることができません。
私は単純なモデルを持っています:
//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);
データをフォームに正しくマッピングしています。
リチャードの返事とこれについてのもう少しの調査から、私がモデルを初期化した方法は間違っていると思います。既存のビューモデルを使用して、マッパープラグインで動作することを期待することはできないと思います。したがって、代わりに、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);
}
このコードは機能し、期待される動作を提供します
この方法でモデルを再割り当てして、モデルを上書きすることはできません。
あなたがするとき:
ko.applyBindings(helloWorldModel);
「モデルhelloWorldModel
をページにバインドする」と言っています。次に、ノックアウトが通過し、そのモデルのオブザーバブルを接続して、ページにバインドします。
ここでフォームモデルを上書きすると、次のようになります。
helloWorldModel = ko.mapping.fromJS(serverData, helloWorldModel);
モデルオブジェクトを、まったく新しいオブザーバブルを含むまったく新しいオブジェクトで上書きしています。
これを修正するには、この行を次のように変更する必要があります。
ko.mapping.fromJS(serverData, helloWorldModel);
これにより、モデル内のプロパティが処理され、モデルを上書きすることなく再割り当てされます。