解决 ko mapping 数组无法添加新对象的问题

这两天页面模板化的进程有些放缓,使用 ko mapping 插件的情形多了起来。
组员经常问到的问题即是往 ko mapping 数组添加新对象时,报找不到方法的错误;
而使用 ko.observableArray 创建的数组则可以随意添加或删除对象,这简直奇葩问题。
好吧,不管怎样,总要解决问题的。

// 数组定义
var ViewModelArray = ko.mapping.fromJS([]);
<!--绑定文本-->
<ul data-bind="foreach:$data">
    <li data-bind="text:Name().substr(0,5), attr:{'id':Id}"></li>
</ul>

以上定义完成之后,即可以执行页面加载和绑定了。

$(function () {
    ko.applyBindings(ViewModelArray, ul);
});

完成了 ul 的创建之后,某个事件触发了添加动作,需要根据数据创建新的 li 对象添加到 ul 中,例如:

function Add(){
    var data = { Id: $('#txtId').val(), Name: $('#txtName').val() };
    ViewModelArray.push(data); // 这里可能出现“找不到方法”的错误。
}

进过一番调试发现,由于需要对 Name 属性进行特殊处理,绑定文本中使用 Name() 读取了 Name 的值,而添加方法中的 data 是普通 JS 对象,并不具备 ko 对象的属性方法,因此出现了找不到方法的错误。
解决方法:

1、在后台处理好 Name 属性,前端绑定文本尽量不使用属性方法。

2、将 Add 方法中的 data 处理为 ko 对象再添加。

function Add(){
    var data = { Id: $('#txtId').val(), Name: $('#txtName').val() };
    ViewModelArray.push(ko.mapping.formJS(data));
}

建议采用第二种方式。

转载请注明来自飞扬的尘埃的博客。

原文地址:https://www.cnblogs.com/i0air/p/4353345.html