Data binding knockoutjs中的集合绑定不起作用

Data binding knockoutjs中的集合绑定不起作用,data-binding,knockout.js,Data Binding,Knockout.js,我试图使用knockout.js在UI上显示一个规范对象。规范有一个名称,它有几个parameterInfo行。每个ParameterInfo行都有一个ParameterPartNumber和一组信号输入。每个SignalInput只有一个名为Name的属性。我能够显示规范名称、parameterInfo行和ParameterPartNumber,但无法显示我拥有的一组信号输入名称,即使SpecificationModel具有这些值。我正在使用以下代码: HTML代码: <div id="

我试图使用knockout.js在UI上显示一个规范对象。规范有一个名称,它有几个parameterInfo行。每个ParameterInfo行都有一个ParameterPartNumber和一组信号输入。每个SignalInput只有一个名为Name的属性。我能够显示规范名称、parameterInfo行和ParameterPartNumber,但无法显示我拥有的一组信号输入名称,即使SpecificationModel具有这些值。我正在使用以下代码:

HTML代码:

<div id="specificationHeader">

    Name : <input data-bind='value: Name' />
    <br />
    <br />

</div>

<table>
    <thead>
        <tr>
            <th>
                Parameter Part
            </th>

            <th>
                Signal Inputs
            </th>            
       </tr>
    </thead>
    <tbody data-bind="foreach: ParameterInfos">
        <tr>
            <td>
                <input data-bind='value: ParameterPartNumber' />
            </td>

            <td>
                <ul data-bind="foreach: SignalInputs">                    
                    <li><span data-bind='text: Name' /></li>
                </ul>
            </td>            
        </tr>
    </tbody>
</table>
<script type="text/javascript">

    var SpecificationModel = function (specification) {

        var self = this;

        self.Name = ko.observable(specification.Name);

        self.ParameterInfos =   ko.observableArray(ko.utils.arrayMap(specification.ParameterInfos, function (ParameterInfo) {
            return { ParameterPartNumber: ParameterInfo.ParameterPartNumber, SignalInputs: ko.observableArray(ParameterInfo.SignalInputs) };
        }));

    };

    var specificationData = '@Html.Raw(ViewBag.SpecificationData)';
    var viewModel = new SpecificationModel($.parseJSON(specificationData))
    ko.applyBindings(viewModel);

</script>
奇怪的是,由于以下问题的答案,我能够得到一个几乎相似的示例:

尽管如此,绑定代码还是无法正常工作。我错过了什么

编辑:

<div id="specificationHeader">

    Name : <input data-bind='value: Name' />
    <br />
    <br />

</div>

<table>
    <thead>
        <tr>
            <th>
                Parameter Part
            </th>

            <th>
                Signal Inputs
            </th>            
       </tr>
    </thead>
    <tbody data-bind="foreach: ParameterInfos">
        <tr>
            <td>
                <input data-bind='value: ParameterPartNumber' />
            </td>

            <td>
                <ul data-bind="foreach: SignalInputs">                    
                    <li><span data-bind='text: Name' /></li>
                </ul>
            </td>            
        </tr>
    </tbody>
</table>
<script type="text/javascript">

    var SpecificationModel = function (specification) {

        var self = this;

        self.Name = ko.observable(specification.Name);

        self.ParameterInfos =   ko.observableArray(ko.utils.arrayMap(specification.ParameterInfos, function (ParameterInfo) {
            return { ParameterPartNumber: ParameterInfo.ParameterPartNumber, SignalInputs: ko.observableArray(ParameterInfo.SignalInputs) };
        }));

    };

    var specificationData = '@Html.Raw(ViewBag.SpecificationData)';
    var viewModel = new SpecificationModel($.parseJSON(specificationData))
    ko.applyBindings(viewModel);

</script>
好的,下面几行可以工作:

<td data-bind="foreach: SignalInputs">
    <ul >                    
        <li><span data-bind='text: Name' /></li>
    </ul>
</td>

但是,下面的几行没有

<td>
    <ul data-bind="foreach: SignalInputs">                    
        <li><span data-bind='text: Name' /></li>
    </ul>
</td>  


知道为什么吗?在我引用的另一个stackoverflow示例问题中,行的后一个站点起作用。

根据我的经验,当您遇到奇怪的绑定错误时,它通常源于每个绑定的
。因为我对它有太多的问题,我几乎只是走“无集装箱”路线:


  • 项目

  • 根据我的经验,当您遇到奇怪的绑定错误时,它通常源于每个
    绑定的
    。因为我对它有太多的问题,我几乎只是走“无集装箱”路线:

    
    
  • 项目

  • 我的绑定有问题,但我的问题是因为我使用的早期版本(淘汰版1.2.1)不支持foreach绑定。但是,当我试图引用集合中的元素时,它并没有为无法识别的绑定函数抛出错误,我认为该元素绑定到集合中,使其难以调试


    最后,我使用了一个模板绑定,答案如下:

    我的绑定有问题,但我的问题最终证明是因为我使用的早期版本(knockout 1.2.1)不支持foreach绑定。但是,当我试图引用集合中的元素时,它并没有为无法识别的绑定函数抛出错误,我认为该元素绑定到集合中,使其难以调试


    最后,我使用了一个模板绑定,答案如下:

    我记得在KnockoutJS文档中读到,绑定遇到了空元素问题,比如
    ,他们建议使用
    甚至
    ().

    我记得在KnockoutJS文档中读到,绑定遇到了空元素的问题,比如
    ,他们建议使用
    ,甚至
    ()。

    不确定这是否相关,因为这个答案很久以前就发布了,但我与foreach也有问题。我注意到错误来自于knockout中的jquery调用(我使用的是knockout-2.0.0)和jquery-2.1.1。当我升级到淘汰3.1.0时,这个问题就解决了


    2.0.0是在我通过nuget安装knockout.mapping时安装的,它可能至少依赖于2.0.0。希望这对某人有所帮助…

    不确定这是否相关,因为这个答案很久以前就发布了,但我对foreach也有问题。我注意到错误来自于knockout中的jquery调用(我使用的是knockout-2.0.0)和jquery-2.1.1。当我升级到淘汰3.1.0时,这个问题就解决了


    2.0.0是在我通过nuget安装knockout.mapping时安装的,它可能至少依赖于2.0.0。希望这有助于某人……

    也许你可以用这把小提琴复制:谢谢@RP Niemeyer。我检查了小提琴,它似乎有和我一样的问题。它不显示信号输入。实际上,它不显示任何数据。您使用的是什么浏览器?它在Chrome/IE9/Firefox中显示驻车制动和空档。你在小提琴上看到了什么?我在Chrome上试过,IE 9和IE 8。任何一个都不起作用。您可以检查开发控制台中的错误或查看网络选项卡吗?否则,单击“管理资源”并尝试导航到KO文件的链接。似乎你没有从你的位置得到正确的文件。我觉得在所有浏览器中都不错。也许你可以用这把小提琴来复制:谢谢@RP Niemeyer。我检查了小提琴,它似乎有和我一样的问题。它不显示信号输入。实际上,它不显示任何数据。您使用的是什么浏览器?它在Chrome/IE9/Firefox中显示驻车制动和空档。你在小提琴上看到了什么?我在Chrome上试过,IE 9和IE 8。任何一个都不起作用。您可以检查开发控制台中的错误或查看网络选项卡吗?否则,单击“管理资源”并尝试导航到KO文件的链接。似乎你没有从你的位置得到正确的文件。在所有浏览器中,它看起来都不错。我修改代码如下:
      • ,现在我确实得到了无序列表,但最后一个元素我得到了两次。知道为什么吗?更新你的答案,这样我们就可以看到格式了。这是不可能的阅读评论。很好的提示,救了我。dom元素上的foreach完全是错误的$数据似乎没有正确绑定。每个人都使用这个方法。我像这样修改了我的代码:
          • ,现在我确实得到了无序列表,但我得到了最后一个元素两次。知道为什么吗?更新你的答案,这样我们就可以看到格式了。这是不可能的阅读评论。很好的提示,救了我。外汇