1

Knockoutを学習していますが、Knockout.mapping.fromJSを機能させることができません。これが私のコードです:

$.getJSON("data/status.json", function(data) {
        var members = ko.mapping.fromJS(data);
});
ko.applyBindings(members);

テンプレートを使用しています。テンプレートは次のとおりです。

<script type="text/html" id="membersTemplate">
    <li data-bind="text: members.dname"></li>
</script>

そしてマークアップ...

<div id="members">
<h2>Members</h2>
<ul data-bind="template: {name: 'membersTemplate', foreach: members}"></ul>
</div>

JSONデータは正しく読み込まれますが、「members」オブジェクトは「undefined」です。(Members.dnameは、多くのオブジェクトプロパティの1つです。)

誰かが私が間違っていることを教えてもらえますか?前もって感謝します!

4

1 に答える 1

0

嬉しいことに、members変数はスコープ外にあるため、AJAX呼び出しが完了した後に失われます。あなたはこのようなものが欲しいです。

$.ajax({url:"/echo/json/", data:json, type:"POST", success:function(data) {
  var viewModel = ko.mapping.fromJS(data);
  ko.applyBindings(viewModel)
}});

したがって、AJAX呼び出しのスコープ内などでバインディングを適用します。

var self = this
self.members = ko.observableArray([]);
$.ajax({url:"/echo/json/", data:json, type:"POST", success:function(data) {
  var members = ko.mapping.fromJS(data);
  self.members(members);
}});
// do the binding elsewhere

これは、クロージャ内で応答をバインドします。AJAX呼び出しはpromiseパターンであるため、応答がいつ完了するかは実際にはわかりません。これが実際の例を含むコードです。

于 2013-01-04T02:59:44.930 に答える