【问题标题】:json and knockoutjson和淘汰赛
【发布时间】:2012-06-06 06:58:36
【问题描述】:

我有一个表“应该”与 json 的结果绑定但它不工作,可能是什么错误?

<table>
<thead>
    <tr>
        <th>
            Id
        </th>
        <th>
            Number
        </th>
        <th>
            Name
        </th>
        <th>
            Password
        </th>
        <th>
            Role
        </th>
    </tr>
</thead>
<tbody data-bind="foreach: model.Employees">
    <tr>
        <td>
            <span data-bind="text: EmployeeId"></span>
        </td>
        <td>
            <span data-bind="text: EmployeeNumber"></span>
        </td>
        <td>
            <span data-bind="text: EmployeeName"></span>
        </td>
        <td>
            <span data-bind="text: EmployeePassword"></span>
        </td>
        <td>
            <span data-bind="text: EmployeeRole"></span>
        </td>
    </tr>
</tbody>

我的淘汰脚本是这样的:

<script type="text/javascript">
$(document).ready(function () {
    var viewModel = {};
    var data = $.getJSON("Employees.json", function (data) {
        viewModel= ko.mapping.fromJSON(data);
        ko.applyBindings(viewModel);
    }
    );
});
</script>

这是我返回的 json 数据示例:

 {"Employees":[{"EmployeeId":1,"EmployeeName":X","EmployeeNumber":"1","EmployeePassword":"x","EmployeeRole":"User"},{"EmployeeId":10,"EmployeeName":"S","EmployeeNumber":"21","EmployeePassword":"s","EmployeeRole":"Admin"}]}

【问题讨论】:

  • 请将此跨度添加到顶部并发布它显示的内容:&lt;span data-bind="text: ko.toJSON($data)"&gt;&lt;/span&gt;
  • 现在使用 Angular js..啊哈哈!这么长时间的淘汰赛......;p

标签: ajax json knockout.js


【解决方案1】:

如果您打开浏览器的错误控制台,我敢打赌您会看到如下内容:

未捕获的错误:无法解析绑定。消息:参考错误: 员工没有定义;绑定值:foreach:Employees

Employees 未在 viewModel 上定义。但是,它是在viewModel.model 上定义的。如果您满足以下任一条件,事情应该会奏效:

  1. data-bindmodel.Employees 上的 foreach 代替:

    <tbody data-bind="foreach: model.Employees">
    

    示例: http://jsfiddle.net/Ze2Zs/

  2. 将 AJAX 请求的结果直接分配给 viewModel 而不是 viewModel.model

    viewModel = ko.mapping.fromJSON(data);
    

    示例: http://jsfiddle.net/wHXeP/

另外作为旁注,无需分配var data = $.getJSON(...),因为响应由回调函数处理:

var viewModel = {};
$.getJSON("Employees.json", function (data) {
    viewModel.model = ko.mapping.fromJSON(data);
    ko.applyBindings(viewModel);
});

【讨论】:

  • 我在你的小提琴中看到 viewModel = ko.mapping.fromJSON(data);和 ko.applyBindings(viewModel);在 var data ={} 之外...但我的在里面,可以吗?
  • 我第一次看这个问题时没有注意到这一点。您可能应该摆脱 AJAX 请求之外的 var data,但应用绑定和 viewModel 代码确实属于回调函数内部。我的略有不同,因为我没有发出 AJAX 请求。
  • 你是对的,它是说错误...我在上面编辑了我的代码,但是,它仍然无法正常工作并且错误不断出现
  • 返回的json数据其实是一个数组,我觉得是这个问题
  • 好的!我修改了它: var trueData = JSON.stringify(data); viewModel.model = ko.mapping.fromJSON(trueData); ko.applyBindings(viewModel);现在可以了! :)
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 2015-06-02
  • 2013-12-18
  • 2015-06-02
  • 2013-06-15
  • 2017-07-07
  • 2014-03-20
  • 2023-04-03
相关资源
最近更新 更多