【问题标题】:Knockout.js fromJSON not Updating ViewModelKnockout.js fromJSON 不更新 ViewModel
【发布时间】:2011-09-20 07:52:33
【问题描述】:

我正在处理以下简单案例:

<ul data-bind='template: {name : "namesTemplate", data:viewModel}'>
</ul>

<script id='namesTemplate' type='text/html'>
    {{each $data}}
        <li>${ Name }</li>
    {{/each}}
</script>

<span data-bind="click: fire">Click Me</span>

<script type='text/javascript'>

    var viewModel = ko.observableArray([{ "Name": "Tom" },
                                        { "Name": "Pete" },
                                        { "Name": "Dave"}]);

    viewModel.fire = function () {
        $.getJSON("Post", function (result) {
            viewModel = ko.mapping.fromJSON(result);
        });
    }

    ko.applyBindings(viewModel);

</script>

getJSON 正在从 ASP.NET MVC 控制器获取 JSON 数据,如下所示:

[{"Name":"Chris"}]

点击点击我后,未更新无序列表。我哪里错了?

谢谢。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    两个想法:

    1) 在视图模型上命名您的属性:

    var viewModel = { employees: ko.observableArray([{ "Name": "Tom" },
                                                     { "Name": "Pete" },
                                                     { "Name": "Dave"}]);
    };
    

    2) 由于您的视图模型中已经有数据,也许您应该使用 ko.mapping.updateFromJS

    viewModel.fire = function () {
        $.getJSON("Post", function (result) {
            ko.mapping.updateFromJS(viewModel.employees, result);
        });
    }
    

    【讨论】:

      【解决方案2】:

      看看我的例子:

      http://jsfiddle.net/YhXyL/

      var viewModel ={
            names: ko.observableArray([{ "Name": "Tom" },
                                       { "Name": "Pete" },
                                       { "Name": "Dave"}])
      };
      
      viewModel.fire = function() {
          this.names([{"Name": "test"}]);
      };
      
      ko.applyBindings(viewModel);
      

      还有HTML:

      <ul data-bind='template: {name : "namesTemplate", foreach:names}'></ul>
      
      <span data-bind="click: fire">Click Me</span>
      
      <script id='namesTemplate' type='text/html'>
          <li data-bind="text: Name"/>
      </script>
      

      如果您想添加新数组,可以使用 push 方法:

      this.names.push([{"Name": "test"}]);
      

      【讨论】:

      • 嘿,为响应欢呼。尝试此操作时,我收到错误: Uncaught TypeError: Object function (d,b){var a=b?d.bind(b):d,f=new p.$a(a,function(){p.a.N(e ,f)});e.push(f);return f} 没有方法 'each' -- 有什么想法吗?
      猜你喜欢
      • 2014-06-11
      • 2012-08-18
      • 1970-01-01
      • 2014-02-23
      • 2013-11-23
      • 2012-01-07
      • 2013-05-16
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多