2011-09-20 118 views
2

我有我的工作与下面的简单情况:Knockout.js fromJSON不更新视图模型

从ASP.NET MVC控制器,它看起来像
<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越来越JSON数据

[{"Name":"Chris"}] 

一旦点击Click Me无序列表没有被更新。我哪里错了?

谢谢。

回答

0

看一看我的例子:

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> 

如果你想添加新的阵列可以使用按键方法:

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

嘿,欢呼的回应。当尝试这个时,我收到错误:Uncaught TypeError:Object function(d,b){var a = b?d.bind(b):d,f = new p。$ a(a,function(){paN(e ,f)}); e.push(f); return f}没有方法'each' - 任何想法? – youwhut

2

个两个想法:

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); 
    }); 
}