2012-01-06 59 views
3

我正在使用Knockout JS创建一个编辑器。我正在使用foreach属性来循环模型中的列表。Knockout JS“uniqueName”绑定 - 同名到两个字段

<tbody data-bind='foreach: Properties'> 

我正在使用jQuery unobtrusive验证需要一个名称属性来验证。我想为两个字段分配相同的名称,以便能够输出验证消息。是否有可能在两个字段上使用相同的uniqueName属性?

<tr> 
    <td> 
     <input data-bind='value: type, uniqueName: true' data-val = "true", data-val-required = "The Type field is required" /></td> 
    </td> 
</tr> 
<tr> 
    <td class="field-validation-valid" data-valmsg-for="UNIQUENAME" data-valmsg-replace="true"></td> 
</tr> 

我复制了下面的示例,它显示了网格编辑和JQuery不显眼的验证。但我不能工作,如何与输入字段

http://knockoutjs.com/examples/gridEditor.html

编辑链接验证消息:

我使用ASP.NET MVC3剃刀语法回路输入。

@Html.DropDownList("Type", new SelectList(types, "Value", "Text"), "Select", new { data_bind = "value: Type", data_val = "true", data_val_required = "The Type field is required" }) 

我无法弄清楚如何更新name属性。当我使用knokcout添加属性时,它们都具有相同的名称“类型”,验证不起作用。他们需要索引一些如何Type1的Type2等

回答

7

唯一名称绑定只是增加一个索引,并设置名称(与修复IE)。

它看起来像:

ko.bindingHandlers['uniqueName'] = { 
    'init': function (element, valueAccessor) { 
     if (valueAccessor()) { 
      element.name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex); 

      // Workaround IE 6/7 issue 
      // - https://github.com/SteveSanderson/knockout/issues/197 
      // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/ 
      if (ko.utils.isIe6 || ko.utils.isIe7) 
       element.mergeAttributes(document.createElement("<input name='" + element.name + "'/>"), false); 
     } 
    } 
}; 

所以,你可以创建一个自定义绑定使用的最后一个索引,并设置相应的属性现在

ko.bindingHandlers.valmsg = { 
    init: function(element) { 
     element.setAttribute("data-valmsg-for", "ko_unique_" + ko.bindingHandlers.uniqueName.currentIndex); 
    } 
}; 

,你只需使用它像:

<tr> 
    <td> 
     <input data-bind='value: type, uniqueName: true' data-val="true", data-val-required="The Type field is required" /> 
    </td> 
</tr> 
<tr> 
    <td class="field-validation-valid" data-bind="valmsg: true" data-valmsg-replace="true"></td> 
</tr> 
+0

如果使用IE6或IE7,这将始终用输入元素替换元素?我使用select以及输入字段。我的问题是使用ASP.NET MVC3 Razor语法,我不知道如何更新名称属性。如果你能提供帮助,我更新了这个问题。 – ministrymason 2012-01-06 15:12:48

+0

它不会用'input'替换它,它只是合并属性。将看看你的更新。 – 2012-01-06 15:31:30

+0

谢谢。一直在这一整天。终于让所有其他工作与验证的名称问题分开了。 – ministrymason 2012-01-06 15:40:14

1

RP-Niemeyer的优秀解决方案衍生出一种可能更简单的方法:

<span class="field-validation-valid" data-bind='attr: {"data-valmsg-for": "ko_unique_" + ko.bindingHandlers.uniqueName.currentIndex}' data-valmsg-replace="true" /> 
0

我想后的评论,但我的名声太低... 非常感谢你RP尼迈耶为您的文章。

我不知道这是否有事情做与requirejs和基因敲除的模块,但我不得不改变

ko.bindingHandlers.uniqueName.currentIndex 

ko.bindingHandlers.uniqueName.Zb 

所以现在我有:

define(["knockout"], function(ko) { 
    ko.bindingHandlers.valmsg = { 
     init: function (element) { 
      element.setAttribute("data-valmsg-for", "ko_unique_" + ko.bindingHandlers.uniqueName.Zb); 
     } 
    }; 
}); 
0

您只需要在子元素中添加一个ControlName属性,并将输入名称绑定到此以及data-valms-for o

<input type="number" class="form-control" data-bind="value: myValue, valueUpdate: 'afterkeydown', attr: {ControlName}" required /> 
<span class="field-validation-valid" data-bind='attr: {"data-valmsg-for":ControlName}' data-valmsg-replace="true"></span>