Javascript 敲除计算属性未绑定

Javascript 敲除计算属性未绑定,javascript,knockout.js,Javascript,Knockout.js,我使用Knockout绑定计算变量时遇到问题。下面是这个问题的一些简化代码。我有一个计算变量selectedClientStrategy,设置时它应该是一个策略对象数组。我可以在预数据绑定中看到它,但它没有填充页面中的第二个select。谢谢你的帮助 <div> <select data-bind="visible:dealClients().length > 0, options: dealClients, optionsText: 'clientName',

我使用Knockout绑定计算变量时遇到问题。下面是这个问题的一些简化代码。我有一个计算变量selectedClientStrategy,设置时它应该是一个策略对象数组。我可以在预数据绑定中看到它,但它没有填充页面中的第二个select。谢谢你的帮助

<div>

    <select data-bind="visible:dealClients().length > 0, options: dealClients, optionsText: 'clientName', value: selectedClient"></select>
    <br />
    <select data-bind="visible:selectedClientStrategies().length > 0, options: selectedClientStrategies, optionsText: 'strategyName'"></select>

</div>
<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>

<script>
//client object
function client(data) {
    var jClient = $.parseJSON(data);

    this.clientId = ko.observable(jClient.documentId);
    this.clientName = ko.observable(jClient.company.companyName);
    this.clientDescription = ko.observable(jClient.company.companyDescription);
    this.clientStrategies = ko.observableArray([]);
    for (var i = 0; i < jClient.strategies.length; i++)
    {
        this.clientStrategies.push(new strategy(jClient.strategies[i]));
    };
}
//strategy object
function strategy(data) {

    this.strategyId = ko.observable(data.documentId);
    this.strategyName = ko.observable(data.strategyName);
    this.strategyClientId = ko.observable(data.clientId);
}
// Overall viewmodel for this screen, along with initial state
function dealViewModel() {
    var self = this;
    self.dealClients = ko.observableArray([]);
    self.selectedClient = ko.observable();
    self.selectedClientStrategies = ko.computed(function ()
    {

        if (self.selectedClient())
        {
            return self.selectedClient().clientStrategies;
        }
        else
        {

            return [new strategy({strategyId: "", strategyName: "", strategyClientId: ""})];
        }

    }
    )

    self.clientData = ko.observable();

    $.getJSON
        (
            '/api/client',
            function (data)
            {
                for (var i = 0; i < data.length; i++)
                {
                    self.dealClients.push(new client(data[i]));
                };
            }
        )
}

ko.applyBindings(new dealViewModel());

selectedClientStrategies依赖于selectedClient,并且selectedClient未初始化,因此在这种情况下,您应该返回策略数组:
return[新策略({strategyId:,strategyName:,strategyClientId:})]并且应该是:返回self.selectedClient().clientStrategies();如果所选客户端具有值


原因是选项必须与对象数组绑定。

请提供一些示例json数据,以便我们对其进行测试。添加了一些示例JSONY您的
中有一个额外的
不会导致分析错误吗?已删除。这是一个剪切粘贴问题。我无法运行此代码。在
client()
中,调用
$.parseJSON(数据)
,它希望数据是字符串,但不是。当我运行此命令时,它没有越过该行。我已经更新了该函数,但是问题仍然是,第二个select从未拾取任何值,即使我可以看到第一个选择填充SelectedClientStrategies。它应该是:返回self.selectedClient().clientStrategies();谢谢,有点像KO的新手,但就像我目前看到的那样。当使用函数而不是属性时有点混乱。仅仅因为它是一个可观察的属性:)
[
  {
  documentId: "client_1",
  documentType: "client",
  company: {
    documentId: "company_97",
    documentType: "company",
    companyName: "gg",
    companyDescription: ""
    },
  strategies: [
    {
      documentId: "strategy_1",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "af"
    },
    {
      documentId: "strategy_10",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "gdf"
    },
    {
      documentId: "strategy_2",
      documentType: "strategy",
      clientId: "client_1",
      highriseId: "fi",
      strategyName: "fi"
    },
    {
      documentId: "strategy_3",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "rp"
    },
    {
      documentId: "strategy_4",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "ad"
    },
    {
      documentId: "strategy_5",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "Df"
    },
    {
      documentId: "strategy_6",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "g"
    },
    {
      documentId: "strategy_7",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "eme"
    },
    {
      documentId: "strategy_8",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "ff"
    },
    {
      documentId: "strategy_9",
      documentType: "strategy",
      clientId: "client_1",
      strategyName: "ggr"
    }
  ]
}
,
{
  documentId: "client_2",
  documentType: "client",
  company: {
    documentId: "company_100",
    documentType: "company",
    companyName: "Mmm",
    companyDescription: "mm"

  },
  strategies: [
    {
      documentId: "strategy_11",
      documentType: "strategy",
      clientId: "client_2",
      strategyName: "GG"
    },
    {
      documentId: "strategy_12",
      documentType: "strategy",
      clientId: "client_2",
      strategyName: "EM"
    },
    {
      documentId: "strategy_13",
      documentType: "strategy",
      clientId: "client_2",
      strategyName: "DG"
    },
    {
      documentId: "strategy_14",
      documentType: "strategy",
      clientId: "client_2",
      strategyName: "GG "
    },
    {
      documentId: "strategy_15",
      documentType: "strategy",
      clientId: "client_2",
      strategyName: "mm"
    }
  ]
}
]