gpt4 book ai didi

javascript - 将 json 数组映射到 ko 抛出错误

转载 作者:行者123 更新时间:2023-12-02 18:17:51 24 4
gpt4 key购买 nike

我是 knockoutjs 的新手。我试图将 json 数据映射到 ko.这是我的代码。

我想解析json数据并将其显示在表格中。当我尝试 ko.compute 时,它​​抛出 self.firstName() 不是一个函数。当我尝试在计算函数之前在控制台中记录firstName的值时,它会打印json数组中的3个值并第四次运行并抛出一个错误,指出self.firstName不是函数。

编辑:当我删除计算并仅打印 json 中的数据时,它能够正确映射。当我使用计算时会出现此问题。当我在计算之前和映射之后尝试 console.log(self.firstName() ) 时,它会打印 jsonarray 中的值,但不是解析 3 次,而是解析 4 次和第 4 次,它给了我“不是函数”错误

<div id="employeeList">
<table border ="2">
<thead>
<tr>
<th> First Name</th>
<th> Last Name</th>
<th> Age</th>
<th> Phone</th>
<th> Email</th>
</tr>
</thead>
<tbody data-bind="foreach:employees">
<tr>
<td data-bind="text:name"></td>
<td data-bind="text:firstName"></td>
<td data-bind="text:lastName"></td>
<td data-bind="text:age"></td>
<td data-bind="text:phone"></td>
<td data-bind="text:email"></td>
</tr>
</tbody>
</table>

</div>

这是我的js代码

     var personMapping={
'copy':['age'],
'employees': {
create: function(options) {
return new PersonViewModel(options.data);
}
}
};


function PersonViewModel(data){
var self=this;
ko.mapping.fromJS(data,personMapping,this);
self.name=ko.computed(function(){
return self.firstName()+' '+self.lastName();
},this);


}



var data={employees:
[{
firstName: 'Marco',
lastName: 'Franssen',
age: 26,
phone: 12346789,
email: "a@a.com"
},
{
firstName: 'Kumar',
lastName: 'Rangarajan',
age: 26,
phone: 123467890,
email: "a@b.com"
},
{
firstName: 'A',
lastName: 'B',
age: 26,
phone: 6775675567567,
email: "a@c.com"}]
}

ko.applyBindings(new PersonViewModel(data), $('#employeeList'));


});

这是jsfiddle代码:http://jsfiddle.net/YfqPs/1/

最佳答案

您的代码被执行了 4 次,因为您正在重用 PersonViewModel 作为主视图模型以及 personMapping 中的 View 模型:

  • 对于此调用的 employees 数组中的每个项目,您的 PersonViewModel 会被调用一次 3 个项目:

    create: function(options) {
    return new PersonViewModel(options.data);
    }
  • 您的 PersonViewModel 因此次调用而被调用 4 次:

    ko.applyBindings(new PersonViewModel(data), $('#employeeList'));

    这次它抛出异常,因为您的主要数据上没有firstName属性,仅适用于您的员工。

有多种方法可以解决此问题,但所有这些方法都需要创建一个适当的独立“主” View 模型。

最简单的解决方案是使用 var viewModel = ko.mapping.fromJS(data, personMapping); 创建“主” View 模型,并在 ko.applyBindings 中使用它>:

var viewModel = ko.mapping.fromJS(data, personMapping);
ko.applyBindings(viewModel, $('#employeeList')[0]);

演示 JSFiddle

关于javascript - 将 json 数组映射到 ko 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19102741/

24 4 0
文章推荐: python - 在 python alpine docker 中安装 python numpy 模块
文章推荐: javascript - JSON是否存储格式化文本并保持格式
文章推荐: javascript - 表单将