Validation 敲除可观测阵列验证的问题

Validation 敲除可观测阵列验证的问题,validation,knockout.js,ko.observablearray,Validation,Knockout.js,Ko.observablearray,我对我在observablearray元素上使用的验证规则有一个问题。我使用一个自定义消息模板来显示错误,问题是当出现错误时,它不会显示,但是,我可以在相关字段中看到“*”。以下是我的模型: function ViewModel(item) { var parse = JSON.parse(item.d); var self = this; this.ID = ko.observable(parse.ID).extend({ required: { params: true, message:

我对我在observablearray元素上使用的验证规则有一个问题。我使用一个自定义消息模板来显示错误,问题是当出现错误时,它不会显示,但是,我可以在相关字段中看到“*”。以下是我的模型:

function ViewModel(item) {
var parse = JSON.parse(item.d);
var self = this;
this.ID = ko.observable(parse.ID).extend({ required: { params: true, message: "ID is required" }});
this.Name = ko.observable(parse.Name);
this.WeeklyData = ko.observableArray([]);
var records = $.map(parse.WeeklyData, function (data) { return new Data(data) });
this.WeeklyData(records);
}

var Data = function (data) {
this.Val = ko.observable(data).extend({
    min: { params: 0, message: "Invalid Minimum Value" },
    max: { params: 168, message: "Invalid Maximum Value" }   
});
以下是我正在使用的验证配置:

    // enable validation
    ko.validation.configure({
    registerExtenders: true,
    messagesOnModified: false,
    insertMessages: true,
    parseInputAttributes: false,
    messageTemplate: "customMessageTemplate",
    grouping: { deep: true }
    });
    ko.validation.init();
任何“我的自定义邮件”模板如下所示:

   <script id="customMessageTemplate" type="text/html">
      <em class="errorMsg" data-bind='visible: !field.isValid()'>*</em>
   </script>

   <ul data-bind="foreach: Errors">
     <li class="errorMsg" data-bind="text: $data"></li>
   </ul>  

*
使用此实现,我在自定义模板中看不到验证消息。但是如果我删除配置deep:true,它不会验证可观察数组元素,而是验证另一个可观察数组元素(ID),然后正确显示消息

我对此感到非常困惑,有点困惑,所以如果有人能帮助我,我将不胜感激/


提前感谢。

我从您的问题中了解到,您正在尝试验证您的observableArray条目,因此,如果您的
WeeklyData
observableArray中的任何条目不符合以下条件:

arrayEntry % 15 === 0
您想显示错误消息。如果是这种情况,则以下自定义验证器可以为您完成此工作:

var fminIncrements = function (valueArray) {
  var check = true;    
  ko.utils.arrayFirst(valueArray, function(value){
        if(parseInt(value, 10) % 15 !== 0)
        {
          check = false;
          return true;
        }
     }); 
  return check;
};
您必须在ObservalArray上应用此验证器(无需对数组的各个条目设置验证)。此验证器将数组作为输入并验证其每个条目,如果任何一个条目未通过验证,它将重新运行false,然后您将看到错误消息

您的viewmodel看起来像:

function viewModel() { 
    var self = this;

    self.WeeklyData = ko.observableArray([
      15, 
      40
    ]).extend({ 
        validation: {
          validator: fminIncrements,
          message: "use 15 min increments" 
        }
    });


    self.errors = ko.validation.group(self);
}

这是我的答案

单个项目没有显示消息-它只是在摘要中-如何在单个文本框中指定消息?

您好,Gaurav,谢谢,我选中了它,但是当您在运行时更改可观察值时,验证不起作用(我删除了小提琴中的只读属性)。为了让它工作?谢谢:)顺便说一句,你给出的解决方案正是我想要的,只是当观测值被更新时,它不起作用。你能发布它不起作用的场景吗?顺便说一句,当你改变可观测阵列时,只有验证有效这是我用的小提琴。我只是删除了textbox的readonly属性,并尝试编辑textbox本身的值。是的,当然,当我在代码中更改ObservalArray中的值时,它就工作了!为什么在运行时更改值时不会发生这种情况?我想我发现了一个问题:messagesOnModified:false,应该设置为true。