【问题标题】:Knockout.js - ko.mapping.fromJS - Visible Binding not updatingKnockout.js - ko.mapping.fromJS - 可见绑定未更新
【发布时间】:2013-07-05 18:39:59
【问题描述】:

我正在开发一个网站,该网站每 5 秒更新一次页面上的值,它调用远程数据库并通过 Get Json 调用返回 MVC 模型,然后调用

viewModel = ko.mapping.fromJS(model).

然后我每 5 秒使用另一个 Get 调用更新此视图模型,然后调用此映射调用

 viewModel = ko.mapping.fromJS(model, viewModel). 

我的 HTML 元素上的绑定是正确的,因为从数据库中检索的原始模型显示在屏幕上,但是当模型上的 IsVisible 属性没有任何反应时,即表行应设置为不可见,而另一个应该设置为可见。

在每次更新时,模型应该不同,行设置为可见或不可见以及其他跨度的文本更新,这部分工作正常,更新显示在页面上,只是可见性没有改变。

可见不可见问题的 HTML 应用,带有更新调用的 Javascript。

模型中的所有变量都已正确调用我无法将模型发布给公众。

<table class="SelectionTable" cellpadding="0" cellspacing="0">
    <tbody data-bind="foreach: { data: markets.Selections, as: 'selections' }">
       <tr class="Selection">
          <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>

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

    var getUpdates = setInterval(function () {
        $.getJSON(
            "/Home/Get", {},
            function (model) {
                viewModel = ko.mapping.fromJS(model, viewModel);
            });
    }, 5000);

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

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

【问题讨论】:

  • 你是说可见代码永远不会工作,无论是在初始数据加载还是后续更新?
  • 对不起,它的原始调用可以工作并显示正确的行,但是它不会隐藏当前可见但现在设置为不可见行的后续更新调用,或者显示最初隐藏的行,但是现在设置为可见行。

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


【解决方案1】:

我发现更新视图模型时有时需要提供空映射:

ko.mapping.fromJS(model, {}, viewModel);

如果失败,则输出selections.IsVisible 的值并确保其格式可以解析为真或假。

【讨论】:

  • “空映射”对我有用,问题仍然存在:为什么或何时?
  • 只需运行 ko.mapping.fromJS(model, {}, viewModel) 而不设置 viewModel 等于它。在这种情况下,它不仅是多余的,而且将 viewModel 作为第三个参数传递就是这样做的。空的 {} 仅表示使用空的自定义映射。
  • 抱歉,我的意思是我不明白为什么有时我必须传入一个空映射来完成这项工作。不过,您不需要将结果分配给视图模型是对的,错过了!
猜你喜欢
  • 1970-01-01
  • 2012-01-07
  • 2017-09-25
  • 2017-12-10
  • 2012-05-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多