敲除验证内可观察到的验证没有triggred

敲除验证内可观察到的验证没有triggred

问题描述:

我有以下JS对象:敲除验证内可观察到的验证没有triggred

var Player = function() { 

     var self = this; 

     self.FirstName= ko.observable().extend({ 
      required: { 
       message: 'Player First Nameis required.' 
      } 
     }); 

     self.LastName= ko.observable().extend({ 
      required: { 
       message: 'Player Last Name is required.' 
      } 
     }); 
    } 

var form= function() { 

    var self = this; 

    self.Name = ko.observable().extend({ 
     required: { 
      message: 'Name is required.' 
     } 
    }); 
    self.Manager = ko.observable().extend({ 
     required: { 
      message: 'Manager is required.' 
     } 
    }); 
    self.Email = ko.observable().extend({ 
     required: { 
      message: 'Email is required.' 
     }, 
     email: { 
      message: 'Entered Email is not valid.' 
     } 
    }); 

    self.Players = ko.observableArray([]); 

} 

Players阵列在上述JS目的是使用以下JS对象使用new Player()语法填充

我已经使用了knockout-validation库的以下设置:

ko.validation.init({ 
    registerExtenders: true, 
    messagesOnModified: true, 
    insertMessages: false, 
    parseInputAttributes: true, 
    messageTemplate: null, 
    decorateInputElement: true, 
    errorElementClass: 'error', 
    grouping: { 
     deep: true, 
     observable: true 
    } 
}, true); 

我使用viewModel.errors.showAllMessages()来显示视图模型中的所有错误消息。我面临的问题是player对象的验证没有被触发,因为它存在于Form对象中。我甚至将deep属性设置为true,但即使这样做不起作用,可能会出现什么问题?

+0

你可以设置一个有用的小提琴吗?即使你使用'validatedObservable'。 –

+1

请尝试将您的代码扩展到[mcve]。如果我自己这样做,并添加缺少的部分来启动和运行(但坚持你提供的代码逐字),[它按预期工作,玩家姓氏得到验证就好](https://jsfiddle.net/jeroenheijmans/2a7t72be /)。 – Jeroen

简短的回答是,您将需要使用{live:true}来跟踪添加到可观察数组的对象的错误。

较长的答案:

我用的Jeroen的小提琴为出发点,并假定你想要的是显示错误消息的所有球员都可验证的观测。

使用ko.validation.group(vm,options)获取错误列表。它是显示showAllMessages函数的返回对象(计算的observable返回一组错误)。

默认情况下,它不会执行提供的视图模型的深度遍历,因此您只会为名称,管理器和电子邮件属性(因为我认为您正在获取当前)获取错误。

要使用深度遍历,可以提供{deep:true}选项。这应该会给你错误的时间函数被调用时在阵列中的所有玩家。

如果您希望在功能被调用后追踪添加到可观察阵列(您的案例中的玩家)的对象,则可以使用{live:true}选项。它将在阵列上创建订阅,并在每次修改数组时更新错误列表。下面是添加它的问题:https://github.com/Knockout-Contrib/Knockout-Validation/pull/223

下面是相关文档片断,这里是小提琴: https://jsfiddle.net/2a7t72be/1/

var form = function() { 
    var self = this; 

    self.showErrors = function(){ 
     self.errors.showAllMessages(); 
    }; 

    // ... 

    self.Players = ko.observableArray([]); 

    self.errors = ko.validation.group(self, { deep: true, live: true }); 
} 

PS。调用validation.init时,您当然可以配置分组选项(只需在您致电之前执行)。