【发布时间】:2013-09-30 20:00:59
【问题描述】:
我是 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/
【问题讨论】:
-
您的视图模型是
PersonViewModel您在ko.applyBindings中使用的,但在您的personMapping中您还使用了PersonViewModel... 这是错字吗?你想用这个实现什么?某种递归映射?顺便说一句,您的小提琴无法正常工作 jquery 并且其中缺少映射插件... -
console.log(this);在PersonViewModel内。我认为这可能是personMapping这可能是您的问题。 -
我想创建自己的映射。因此,我创建了人员映射,我不想将年龄作为可观察的,并创建了员工以映射到我在 foreach 中的员工。我看到这是可以做到的方法之一。
-
@Pricey :我不想为每个变量做一个可观察的。因此我尝试了映射。是的,当我将 firstName 创建为 observable 时,我在使用计算时没有问题。但我希望除了年龄之外的一切都是可观察的。而且我不知道如何在这种情况下进行映射。
-
@KumarR 是的,我把它从我的评论中去掉了,因为我忘了映射是为你做的。我建议您尝试
console.log(this);虽然...请参阅 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 和关于对象方法。
标签: javascript jquery json knockout.js knockout-mapping-plugin