【问题标题】:Knockout Mapping: Object not Filled淘汰赛映射:对象未填充
【发布时间】:2025-12-22 18:50:16
【问题描述】:

我正在学习 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”对象“未定义”。 (Members.dname 是众多对象属性之一。)

谁能告诉我我做错了什么?提前致谢!

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    非常高兴:您的 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 调用是一种承诺模式,因此您真的不知道响应何时完成。这是一个带有工作示例的code

    【讨论】:

    • 太棒了!这解决了它。非常感谢!