asp.net-mvc-4 - 使用 knockout.js 我需要从服务器调用更新我的模型,然后在 View 上显示它

标签 asp.net-mvc-4 knockout.js asp.net-web-api

我使用 MVC 4.0 和 knockout.js 创建一个页面,该页面每 5-10 秒调用一次数据库,并使用从数据库检索的新对象更新模型,然后使用新模型更新 View 。

目前,我正在进行初始 JSON get 调用,这将返回模型,然后我可以将其绑定(bind)到 View 。然后,我再次设置 getJSON 调用,每 10 秒更新一次,它将执行该函数并取回数据,但屏幕上看不到更新。我尝试在每次调用后调用 ko.applyBindings,但页面上仍然没有更新,然后在几次调用后浏览器崩溃。

我不确定我到底做错了什么。我已经包含了下面代码的相关部分。

JavaScript:

<script type="text/javascript">
var viewModel;

var update = setInterval(function () {
    $.getJSON(
                "/Home/Get", {},
                function (model) {
                    viewModel = model;
                    bindViewModel(viewModel);
                });
}, 10000);

$(document).ready(
    function () {
        $.getJSON(
            "/Home/Get", {},
            function (model) {
                viewModel = model;
                bindViewModel(viewModel);
            });
    });


function bindViewModel(viewModel) {
    ko.applyBindings(viewModel);
}
</script>

显示模型的表格

<div data-bind="foreach: { data: Events, as: 'evnts' }">
<span data-bind="text: evnts.LastUpdate"></span>
<table id="EventsTable" style="display:inline; float:left;">
    <tbody>
        <tr id="EvntsHeader" data-bind="visible: evnts.IsVisible">
        <td>
            <span data-bind="text: evnts.Name"></span>
        </td>
        <tr>
            <td>
                <table id="MarketsTable">
                    <tbody data-bind="foreach: { data: evnts.Markets, as: 'markets' }">
                        <tr>
                            <td id="MarketHeader">
                                <span data-bind="text: markets.Name"></span>
                                <span data-bind="text: markets.NumberOfRunners"></span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <table id="SelectionTable">
                                    <tbody data-bind="foreach: { data: markets.Selections, as: 'selections' }">
                                        <tr id="Selections">
                                            <td><span data-bind="text: selections.Number, visible: selections.IsVisible"></span></td>
                                            <td><span data-bind="text: selections.Name, visible: selections.IsVisible"></span></td>
                                            <td><span data-bind="text: selections.CurrentPrice, visible: selections.IsVisible"></span></td>
                                            <td><span data-bind="text: selections.OpeningPrice, visible: selections.IsVisible"></span></td>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
    </tbody>
</table>

Controller - JSON 获取

[AcceptVerbs(HttpVerbs.Get)]
    public JsonResult Get()
    {
        var model = new TestModel {LastUpdate = DateTime.Now};

        if (TestConstants.Update == false)
        {
            GetModelFirstTime(model);
            TestConstants.Update = true;
        }
        else
        {
            UpdateModel(model, DateTime.Now);
        }

        return Json(model, JsonRequestBehavior.AllowGet);
    }

最佳答案

理想情况下,您只想应用绑定(bind)一次,并且通常在页面加载时完成。不要在更新中调用bindViewModel,而是尝试使用:

ko.mapping.updateFromJS(viewModel, model);

如果您想阅读更多有关映射的内容 - http://knockoutjs.com/documentation/plugins-mapping.html

让我知道它是否有效...

关于asp.net-mvc-4 - 使用 knockout.js 我需要从服务器调用更新我的模型,然后在 View 上显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447853/

相关文章:

javascript - KnockOut 的计算函数问题

c# - 如何使用 C#.Net 存储不同响应类型的 API 结果集

javascript - jQuery 不隐藏 div (mvc 4)

c# - C# 中的全局变量替代品?

javascript - 为什么我的 viewModel 在 HTML 中更新,但在 javascript 中却没有更新?

相当于 C# LINQ Select 的 Javascript

c# - 使用 ASP.NET WebAPI 发布复杂对象

c# - 从 web api post 返回文本\纯 json 响应

javascript - 里面有文字的复选框

c# - 我的 asp.net mvc web 应用程序中的 OutputCache 设置。防止缓存的多种语法