2012-09-26 26 views
2

我目前正在研究一些Knockout js模板的东西。我的要求是我需要设置字段(输入)的名称与字符串和该行的索引值的组合。 例如“xxx3”。在模板中敲除js字符串格式索引

我试了两个选项。

'xxx' + ko.utils.arrayIndexOf(viewModel.mycollection, $data) 

'xxx' + $index 

第一个选项总是给人“-1”我的索引值和第二个选项不工作 becasue好像我只能用$索引值没有任何字符串连接。

有人可以让我知道,如果我可以在敲除输出中将字符串值连接到$ index值,以便我可以将其设置为输入字段的名称属性。

我想要的最终结果应该是这样的。

<input class="text-box single-line" data-val="true" 
    data-val-required="The XXX field is required." id="XXX" type="text" name="XXX3"> 

这是我的模板的样子。

<table id ="editorRows" class="table"> 
     <tbody data-bind='template: {name: "rowTemplate", foreach: Rules }'></tbody> 
    </table> 

    <script id="rowTemplate" type="text/html"> 
     <tr data-bind="attr: { id: RuleKey }"> 
      <td> 
       <div class="editor-field"> 
        <input class="text-box single-line" data-val="true" data-val-required="The Name field is required." id="Name" type="text" data-bind="value: Name, attr: {name : 'Rules[' + $index + '].Name'}" /> 
        <span class="field-validation-valid" data-bind="attr : { 'data-valmsg-for': 'Rules[' + $index + '].Name'}" data-valmsg-replace="true"></span> 
       </div> 
      </td> 
</tr> 
</script> 
+0

发布您的模板代码。 –

+0

'$ index'只能在foreach绑定的情况下使用。你在正确的地方使用它吗? –

+0

为什么你要做'attr:{name:'Rules ['+ $ index +'] .Name''它。 'attr:{name:Name}不工作,或者你想要名称像Rules [0] .Name。 –

回答

3

$index是一个可观察的,所以你需要调用它来检索值。所以假设你试图设置的属性值为字面Rule[0].Name,你会这样做:

<input class="text-box single-line" data-val="true" data-val-required="The Name field is required." id="Name" type="text" 
     data-bind="value: Name, attr: {name : 'Rules[' + $index() + '].Name'}" /> 
<span class="field-validation-valid" data-valmsg-replace="true" 
     data-bind="attr : { 'data-valmsg-for': 'Rules[' + $index() + '].Name'}"></span> 
+0

完美......这正是我所需要的。谢谢杰夫。你碰巧知道为什么我的第一个选项总是给索引'-1'? –

+0

我不确定在什么情况下绑定是在所以我不能真正给你一个答案。它可能是一些事情:'$ data'可能被包含在一个可观察对象中,'viewModel.mycollection'可能不存在于该上下文中(这通常会导致绑定错误),或者'viewModel.mycollection'是可观察对象数组,所以你不正确地访问它(你需要调用它来获取数组的内容)。请记住,如果你的绑定表达式很复杂,你需要调用_all_ observables或者你会遇到问题。 –