Knockout.js 具有敲除的字段的动态绑定

Knockout.js 具有敲除的字段的动态绑定,knockout.js,Knockout.js,请参见我创建的以下示例。 在本例中,“津贴”模型包含各种属性。在这些属性中,对于特定的容差,屏幕上显示的属性包含在“字段”数组中 在下面的HTML代码中 <div data-bind="foreach : allowanceList"> <div style="display : block; width : 100%"> <span data-bind="text : allowanceTitle"></span> </d

请参见我创建的以下示例。

在本例中,“津贴”模型包含各种属性。在这些属性中,对于特定的容差,屏幕上显示的属性包含在“字段”数组中

在下面的HTML代码中

<div data-bind="foreach : allowanceList">
  <div style="display : block; width : 100%">
    <span data-bind="text : allowanceTitle"></span>
  </div>
  <div style="margin-left : 20px" data-bind="foreach : fields">
    <div style="display : block; width : 100%">
      <label data-bind="text : title"></label>
      <!-- ko if : typeOfField() == "input"-->
      <input data-bind="value : '$parentContext.' + allowanceVariable() " />
      <!-- /ko -->
    </div>
  </div>
  <br/>
</div>


我想将
绑定到allowanceList对象的属性,该对象的名称包含在
'fields'
数组的
'allowanceVariable'
变量的值中

例如,对于
allowanceList
的第一次迭代和
字段的第一次迭代,
allowanceVariable()
的值为“小时”。 因此,对于这个迭代,我想将
绑定到
allowanceList的当前对象的'hours'字段

从小提琴中可以看出,目前,knockout只将$parentContext.hours复制到输入中


如何实现所需的结果?

通过使用模型内部的函数,可以实现所需的结果。 下面是演示答案的小提琴

在这里,我调用了内部for循环和 我已将
$parent
对象传递给它

在函数中,我检查了
allowanceVariable
的值,并相应地返回了
allowanceVariable
模型对应变量的值


如果适用,请建议其他更好的解决方案,因为在此解决方案中,我必须在
dynamicValue
函数中对
allowment
模型的属性名称进行硬编码,但这肯定解决了我的问题。

在您的回答中,您正在对
allowanceVariable
s进行硬编码,并使用if-else链分别检查它们。对于添加的每个属性,都必须更新
if-else
块。它可以工作,但它们不再是动态的
字段

相反,像这样:

<div data-bind="foreach: { data: allowanceList, as: '_allowance'}">
  <div style="display : block; width : 100%">
    <span data-bind="text : allowanceTitle"></span>
  </div>
  <div style="margin-left : 20px" data-bind="foreach: { data: _allowance.fields, as: '_field'}">
    <div style="display : block; width : 100%">
      <label data-bind="text : title"></label>
      <!-- ko if : typeOfField() == "input"-->
      <input data-bind="value : _allowance[_field.allowanceVariable()]" />
      <!-- /ko -->
    </div>
  </div>
</div>
<div data-bind="foreach : allowanceList">
  <div style="display : block; width : 100%">
    <span data-bind="text : allowanceTitle"></span>
  </div>
  <div style="margin-left : 20px; display : block; width : 100%" data-bind="foreach : fields">
    <div style="display : block; width : 100%">
      <label data-bind="text : title"></label>
      <!-- ko if : typeOfField() == "input"-->
      <input data-bind="value : $parent[$data.allowanceVariable()]" />
      <!-- /ko -->
    </div>
  </div>
  <br/>
</div>


但是,我认为前一种方法更干净,也更容易理解。顺便说一句,制作整洁小提琴的好东西:)

这正是我想要的。谢谢