Knockout.js映射不显示绑定在子observableArray上的数据

时间:2013-06-17 19:43:04

标签: knockout.js knockout-mapping-plugin

我在定义的对象上有一个子可观察数组。当返回服务器中的对象并将其填充到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。 ;-)对不起那里的混乱。

1 个答案:

答案 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;
    

演示JSFiddle.

相关问题