knockout.js - 使用从服务器接收的 JSON 数据更新 View 模型时刷新 Knockout 绑定(bind)

标签 knockout.js

我有一个 knockout View 模型,每次单击按钮时都会使用从服务器接收的 JSON 数据进行更新,并且希望根据 viewModel 的更改刷新绑定(bind)。我正在使用 knockout 映射将 JSON 转换为 KO 可观察量。

我的问题是,当单击按钮更新 View 模型时,绑定(bind)不会刷新

样本 fiddle 是 here

JS:

    function getPlayersAsJSON(country) {
    var players = null;
    if (country === 'spain') {
        players = $('#spainText').val();
    } else if (country === 'swiss') {
        players = $('#swissText').val();
    }
    return players;
}

var viewModel = {
    players: ko.observableArray()
};

$(function () {
    $('#btnSearch').click(function () {
        var playerDataJSON = getPlayersAsJSON($('#drpCountry').val());
        var playerData = ko.mapping.fromJSON(playerDataJSON);
        console.log(playerDataJSON);
        console.log(playerData);
        console.log(playerData());
        viewModel.players(playerDataJSON);
    });
});

ko.applyBindings(viewModel);

HTML:

    <div>JSON Data for Spain
    <br/>
    <textArea id="spainText" rows="4" cols="50">[{"Name": "Nadal","Age": 28},{"Name": "Ferrer","Age": 32},{"Name": "Ferrer", "Age": 29}]</textArea>
    <br/>JSON Data for Swiss
    <br/>
    <textArea id="swissText" rows="4" cols="50">[{"Name": "Federer","Age": 32},{"Name": "Wawiranka", "Age": 28}]</textArea>
</div>
<br/>
<div>Select Country
    <br/>
    <select id="drpCountry">
        <option value="spain">spain</option>
        <option value="swiss">swiss</option>
    </select>
</div>
<input type="button" id="btnSearch" value="Search" />
<br/>
<table>
    <thead>
        <tr>
            <th>Name</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: players">
        <tr>
            <td data-bind="text: $data.Name"></td>
            <td data-bind="text: $data.Age"></td>
        </tr>
    </tbody>
</table>

如果您需要更多详细信息,请告诉我

最佳答案

如果输入是数组,则 ko.mapping.fromJSON 将返回 ko.observableArray

因此,您需要编写 playerData() 来解开可观察数组,否则最终您的 players 可观察数组将包含另一个可观察数组:

var playerData = ko.mapping.fromJSON(playerDataJSON);
viewModel.players(playerData()); //unwrap the playerData 

演示 JSFiddle .

作为替代解决方案,如果输入是 JSON 数组,映射插件支持直接填充已存在的可观察数组,语法如下:

ko.mapping.fromJSON(playerDataJSON, {} /* empty options */, viewModel.players);

演示 JSFiddle .

关于knockout.js - 使用从服务器接收的 JSON 数据更新 View 模型时刷新 Knockout 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22672539/

相关文章:

javascript - 如何在动态添加的内容中绑定(bind)knockout.js中的事件?

javascript - KnockoutJS 映射插件 (observableArray)

javascript - KnockoutJS 代码不输出任何内容,但没有错误

knockout.js - knockout 验证 hello world 未在 jsfiddle 上运行

javascript - 使用复杂对象上的挖空功能手动设置选择框的默认值

knockout.js - 如何使用knockout js验证进行验证?

javascript - 如何更新表单中表示的 JSON 对象

javascript - knockout 多个数组绑定(bind)到行跨度表

javascript - 可观察数组值未更新

html - 如何防止 knockout 从 IE8 跨度同级中剥离空文本节点