我正在从Web服务重新调用JSON对象并使用knockout 2.01来显示结果。我能够毫无问题地显示我的结果,但是一旦我尝试将计算的observable添加到视图模型中,我就会得到以下错误。
下面的代码我错过了什么?
未捕获的TypeError:对象#没有方法'dateCreated'
!--- JSON
{"jobTitle":"Digital designer","dateCreated":"7/7/2012","timeCreated":"2:27 PM","location":"Perth","jobSummary":"one\ntwo\nthree","Uri":"/candidates/view-all-jobs/digital-designer/","CreateDate":"\/Date(1341635236000)\/"}
! - html
<div data-bind="foreach: $data">
<article>
<header>
<time datetime="2007-08-29T13:58Z"></time>
<h3><a target="_self" data-bind="text: $data.location"> </a> </h3>
</header>
<span data-bind="text: $data.fullDate"> </span> </article>
</div>
! - 代码
var viewModel = ko.observableArray();
$(document).ready(function () {
if ($('#featured-jobs').length > 0) {
$.ajax({
type: 'POST',
url: "handler/jobServer.ashx",
data: { 'jobType': '1' },
success: OnComplete,
error: OnFail,
dataType: 'json'
});
}
});
function OnComplete(result) {
var self = this;
ko.mapping.fromJS(result, {}, viewModel);
self.fullDate = ko.computed(
function () {
return self.dateCreated() + " " + self.timeCreated();
}, self);
ko.applyBindings(new viewModel());
}
function OnFail(result) {
alert('Request Failed');
}
答案 0 :(得分:1)
这是因为onComplete创建了一个名为self
的新对象,该对象没有dateCreated
属性。我认为你真正想要的是将计算的observable添加到viewModel
中的每个项目。
修改:
Observable很棒,但有时它们不是答案(特别是如果一个值不太可能改变,就像我怀疑“创建日期”和“创建时间”的情况一样)。这是我将如何做到(没有可观察的)。 注意,您仍然可以绑定到不可观察的属性:
function OnComplete(result) {
for (var i = 0; i < result.length; i++)
{
result[i].fullDate = result[i].dateCreated + " " + result[i].timeCreated;
}
viewModel(result);
ko.applyBindings(viewModel);
}
如果我错了,并且用户将操纵这些值,您可以这样做(使用observables):
function OnComplete(result) {
ko.mapping.fromJS(result, {}, viewModel);
for (var i = 0; i < viewModel.length; i++)
{
viewModel[i].fullDate = ko.computed(
function () {
return this.dateCreated() + " " + this.timeCreated();
}, viewModel[i]);
}
ko.applyBindings(viewModel);
}