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

建议采用第二种方式。

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

时间: 2024-07-29 02:52:58

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

JS如何向一个对象数组里面添加新的属性

向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> { arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))console.log(arry2); 将一个对象数组数据拿出来变成另一个对象var arry= [{a:

JavaScript之jQuery-9 jQuery 开发插件(添加新全局函数、添加jQuery对象方法、添加新简写方法、方法参数)

一.添加新的全局函数 全局函数 - 全局函数,实际上就是jQuery对象的方法,从实践角度看,它们是位于jQuery命名空间内部的函数 - jQuery内置的某些功能是通过全局函数实现的 - $.ajax()函数就是典型的全局函数 - 向jQuery命名空间添加一个函数,只需要将这个新函数指定为jQuery的一个属性值   - 如果要使用该全局函数时,可通过一下代码调用 - 也可以通过别名来调用 添加多个函数 - 如果我们想在插件中提供多个全局函数,可以独立的声明这些函数   - 还可以使用$.

添加新数组去重 MJ刷新数据时用到

// 2个数组去重方法封装, 返回新数组, 添加了不重复的新对象 - (数量变多) - (NSMutableArray *)quChongWithOldArr:(NSMutableArray *)oldArr addNewArr:(NSArray *)newArr {     NSMutableArray *resultArr = [NSMutableArrayarray];          for (VShowRoomObject * newRoom in newArr) {        

WebKit JavaScript Binding添加新DOM对象的三种方式

一.基础知识 首先WebKit IDL并非完全遵循Web IDL,只是借鉴使用.WebKit官网提供了一份说明(WebKitIDL),比如Web IDL称"operation”(操作), 而WebKitIDL称为"method"(方法), 另外Web IDL也不像WebKitIDL那样将属性和参数分开. 为JavaScript绑定对象,可以使用module来定义所从属的模组. 典型的module包括: core, window, event, traversal, range

PostgreSQL添加新服务器连接时,报错“Server doesn&#39;t listen ”,已解决。

PostgreSQL添加新的服务器连接时,报错: 解决方法: 第一步:修改配置文件中连接的服务器列表,添加服务器IP地址(图pg002.png) 配置文件地址:数据库右击属性,打开数据库的安装路径在data文件中找到配置文件pg_hba.conf. 如:D:\Program Files\PostgreSQL\9.4\data\pg_hba.conf 注:只要修改IP路径就可以了,‘/’后面的数字都为32. 第二步:修改配置文件后,启动服务器的服务: 启动服务完成,连接服务器,新服务器就可以正常的

DEDE后台添加新变量出现:Request var not allow!的解决办法 相关案例演

论坛上很多人都反馈说在后台添加新变量的时候会出现 "Request var not allow!" 的BUG错误,本文主要就是介绍如何去解决这个问题!下面看具体操纵:在DEDE根目录打开 include/common.inc.php 文件,查找到以下内容: //检查和注册外部提交的变量function CheckRequest(&$val) {if (is_array($val)) {foreach ($val as $_k=>$_v) {CheckRequest($_k

数组中的对象的特征值提取生成新对象实现方法

最近要做一个可视化的SQL语句生成功能视图, 项目中遇到一个JSON保存后还原的问题,由于保存之前和后台沟通约定好保存的JSON格式,所以在还原的时候,就要按照保存的格式来进行逆向解析. 首先来看一下保存的JSON内容 var oldObj= [ { "fieldName": "上班时间1", "fieldId": "working_hours_1", "fieldType": "time&quo

数组添加新的属性,旧的数组的属性提到新的数组里去

1.数组添加新的属性: 1.1:先建一个数组: var oldArr=[{name:'li'},{name:'hi'},{name:'us'}] 1.2:为这个数组添加一个新的属性进去的方法: function loopPushObj(oldArr) { let arr=[]; if(oldArr&&oldArr.length>0) { for(var i in oldArr) { var tempobj = {}; tempobj = oldArr[i]; tempobj['sex

解决CentOS添加新网卡后找不到网卡配置文件,配置多网卡并设置静态路由

参考文章 https://blog.csdn.net/qq_36512792/article/details/79787649 使用VMware Workstation虚拟机安装好CentOS7虚拟机后,添加网卡后CentOS 7无网卡配置文件的问题,添加第二块网卡以后,进入CentOS 7系统后,看不到网卡配置文件. 进入CentOS7系统后,使用ip addr 查看状态如下: 发现ens33和ens77均有IP地址,且可正常使用,ens33使用的是手动配置IP,ens37使用的是dhcp自动