我在定义的对象上有一个子可观察数组。当返回服务器中的对象并将其填充到knockout observable中时,数据无法显示。但是视图模型中的数据可以通过调试进行验证。我创建了jsFiddle来说明问题。
http://jsfiddle.net/CraigHead/Y2Fr6/
我的视图模型定义为
function PropertyLease(propertyLeaseId, propertyCatalogId, confirmedBldgSF, leaseExpenseStructure, leaseTermRate, propertyType, yearBuilt)
{
var self = this;
self.PropertyLeaseId = ko.observable(propertyLeaseId);
self.PropertyCatalogId = ko.observable(propertyCatalogId);
self.ConfirmedBldgSF = ko.observable(confirmedBldgSF);
self.LeaseExpenseStructure = ko.observable(leaseExpenseStructure);
self.LeaseTermRate = ko.mapping.fromJS(leaseTermRate);
self.PropertyType = ko.observable(propertyType);
self.YearBuilt = ko.observable(yearBuilt);
}
function PropertyLeaseTermRate(propertyLeaseTermId, propertyLeaseId, from, to, annualRatePSF)
{
var self = this;
self.PropertyLeaseTermId = ko.observable(propertyLeaseTermId);
self.PropertyLeaseId = ko.observable(propertyLeaseId);
self.From = ko.observable(from);
self.To = ko.observable(to);
self.AnnualRatePSF = ko.observable(annualRatePSF);
}
我从服务器返回数据时更新它们,如
viewModel.LeaseSearchResults.removeAll();
var vmLeaseSearchResults = viewModel.LeaseSearchResults();
for(var idx = 0; idx<result.LeaseSearchResults.length; idx++){
var data = result.LeaseSearchResults[idx];
vmLeaseSearchResults.push(
new PropertyLease(
data.PropertyLeaseId,
data.PropertyCatalogId,
data.ConfirmedBldgSF,
data.LeaseExpenseStructure,
data.LeaseTermRate,
data.PropertyType,
data.YearBuilt
)
)
}
viewModel.LeaseSearchResults.valueHasMutated();
我不确定我做错了什么?精氨酸!
P.S。在用户从数据网格中进行选择之前,不会使用第二个视图模型PropertyLeaseTermRate
。 ;-)对不起那里的混乱。
答案 0 :(得分:1)
您有多个问题:
如果您正在编写var vmLeaseSearchResults = viewModel.LeaseSearchResults();
,因为()
引用了underaying数组,而不是可观察数组本身。因此,当您致电vmLeaseSearchResults.push
时,Knockout将不会收到通知,因此您需要拨打电话valueHasMutated
。
但正确的做法是让Knockout进行更改跟踪,因此您应该移除()
:所以var vmLeaseSearchResults = viewModel.LeaseSearchResults;
,然后您不需要valueHasMutated
来电。
var vmLeaseTermRate = viewModel.SelectedLease().LeaseTermRate();
然而,这里有第二个问题。当您拨打viewModel.SelectedLease(value);
时,敲门会开始在<div data-bind="with: SelectedLease">
中绑定您的详细信息列表。但是您的模型(value
)尚未定义LeaseTermRate
,因此Knockout将在ko foreach: LeaseTermRate
上无声地失败。
要解决此问题,只需在LeaseTermRate
电话前移动SelectedLease
声明:
var value = ko.mapping.fromJS(item);
value.LeaseTermRate = ko.observableArray();
viewModel.SelectedLease(value);
var vmLeaseTermRate = viewModel.SelectedLease().LeaseTermRate;