Asp.net mvc ASP.NET MVC和knockout.js从json映射并添加嵌套的计算变量
我想将计算字段添加到淘汰VM。在服务器端,我有一个模型:Asp.net mvc ASP.NET MVC和knockout.js从json映射并添加嵌套的计算变量,asp.net-mvc,json,knockout.js,Asp.net Mvc,Json,Knockout.js,我想将计算字段添加到淘汰VM。在服务器端,我有一个模型: public class Person { public string Name { get; set } public string Surname { get; set; } } public class PersonsOverviewModel { public Person[] Persons { get; set; } } 在客户端VM中,我希望每个人都有计算字段全名,VM应该由json数据生成,我就
public class Person {
public string Name { get; set }
public string Surname { get; set; }
}
public class PersonsOverviewModel {
public Person[] Persons { get; set; }
}
在客户端VM中,我希望每个人都有计算字段全名,VM应该由json数据生成,我就是这样做的:
var overviewVM = null; //default value
function Init(data){ // data is serialized model from server
overviewVm = ko.mapping.fromJS(data, {}, overviewVm);
$.each(overviewVm.Persons(), function (index, person) {
person.FullName = ko.computed(function () { // add FullName field to each person
return person.Name() + person.Surname();
});
});
}
它在绑定到表时按预期工作。然而,从服务器刷新数据后,我在
overviewVm = ko.mapping.fromJS(data, {}, overviewVm);
也就是说,由于缺少全名,无法映射该数据。如果我在从JS映射之前将overviewVm设置为null,它将成功映射,但由于某些原因不会更新表,如果我尝试取消绑定并再次绑定,它将向表中添加正确的值,但不会删除旧值。
这是表的外观:
<table id="coverview-table" class="grid">
<thead class="gridHeader">
<tr>
<th>Name</th>
<th>Surname</th>
<th>FullName</th>
</tr>
</thead>
<tbody data-bind="foreach: Persons">
<tr class="gridRow">
<td data-bind="text: Name"></td>
<td data-bind="text: Surname"></td>
<td data-bind="text: FullName"></td>
</tr>
</tbody>
名称
姓
全名
我知道我可以找到另一种方法将全名放入表中,但这只是我的情况的简化版本,我想找到正确的方法来处理淘汰和数据刷新
var mappingOptions = {
'Persons': {
create: function (options) {
return (new(function () {
this.FullName = ko.computed(function () {
return this.Name() + this.Surname();
}, this);
ko.mapping.fromJS(options.data, {}, this); // continue the standard mapping
})());
}
}
};
然后在映射数据时使用mappingOptions
ko.mapping.fromJS(数据、映射选项、概览VM)代码>
可能重复的