【问题标题】:Is there a way to extend validation on Knockout Validation's validatedObservable?有没有办法在 Knockout Validation 的validatedObservable 上扩展验证?
【发布时间】:2016-07-24 08:10:29
【问题描述】:

我需要确保每个 observable 都是有效的,还要确保所有 observable 一起有效。在我的简化示例中,我有一个 modelNumber 和 stockNumber,它们都是必需的,但它们一起也必须形成一个有效的 partNumber。我的尝试给了我这个错误:

“未捕获的错误:无法将值写入 ko.computed,除非您指定 'write' 选项。如果您希望读取当前值,请不要传递任何参数。”

有什么问题?

https://jsfiddle.net/yekr2ov2/18/

// enable validation
ko.validation.init();

ko.validation.rules['partNumberValid'] = {
  validator: function(partInfo, otherVal) {
    return partInfo.modelNumber() + partInfo.stockNumber() == "m1s1";
  },
  message: 'part number is invalid'
};
ko.validation.registerExtenders();

function VM() {
  var self = this;

  self.modelNumber = ko.observable().extend({ required: true });
  self.stockNumber = ko.observable().extend({ required: true });
  self.vinNumber   = ko.observable().extend({ required: true });

  self.isPartNumberValid = ko.validatedObservable({
    modelNumber: self.modelNumber,
    stockNumber: self.stockNumber,
    vinNumber: self.vinNumber
  }).extend({ partNumberValid: true });

  self.message = ko.observable();

  self.save = function() {
    if (self.isPartNumberValid.isValid()) {
      self.message("saved");
    } 
    else {
      debugger;
      //self.isPartNumberValid.errors.showAllMessages();
      self.message("not saved");
    }    
  };

}

ko.applyBindings(new VM());

【问题讨论】:

  • 顺便说一句,ko.validation.group 不是您真正想要的吗?
  • @Jeroen,差不多。 ko.validation.group 会根据每个验证告诉我所有部分是否有效。我还想知道所有部分是否一起构成有效组合。所以,在这样解释之后,我想我有一个答案。

标签: knockout.js knockout-validation


【解决方案1】:

我已经修改了代码,下面的代码可以正常工作。

ko.validation.init();
ko.validation.rules['partNumberValid'] = {
 validator: function (partInfo, otherVal) {                           
              return partInfo.modelNumber() +''+ partInfo.stockNumber() === "m1s1";
            },
 message: 'part number is invalid'
           };
 ko.validation.registerExtenders();

 function VM() {
   var self = this;
   self.modelNumber = ko.observable().extend({required: true});
   self.stockNumber = ko.observable().extend({required: true});
   self.isPartNumberValid = ko.observable({                        
     modelNumber:self.modelNumber,
     stockNumber:self.stockNumber                                         
   }).extend({partNumberValid:true});

  self.validateMe = ko.computed(function(){
                        write:{
                            var tes = ko.validation.group([self.modelNumber,self.stockNumber,self.isPartNumberValid]);
                            tes.showAllMessages(true);
                        }
                    });
                }
  ko.applyBindings(new VM()); 

小提琴:https://jsfiddle.net/yekr2ov2/7/ 我使用 ko.validation.group 来验证 observables 并计算以立即验证。您可以用按钮单击或任何其他自定义函数替换计算。让我知道这是否有帮助。

谢谢你

【讨论】:

  • 这不太行。它将显示所有验证消息,但不会验证每个部分和整体。我对您的示例进行了更新,显示 isPartNumberValid 即使其部分数据无效,也会错误地看起来有效。 jsfiddle.net/yekr2ov2/16
  • 敲除验证插件有一个删除验证的选项。这样您就可以控制验证显示,它是针对某些特定的或整体的。
【解决方案2】:

我认为答案是您不能在 Knockout Validation 的validatedObservable 上扩展验证。我认为这里的正确答案是为每个需要验证的事物或事物组创建一个observable,然后创建一个validatedObservable 来验证所有这些observables

https://jsfiddle.net/yekr2ov2/17/

ko.validation.init();
ko.validation.rules['partNumberValid'] = {
  validator: function(partInfo, otherVal) {
    return partInfo.modelNumber() + partInfo.stockNumber() === "m1s1";
  },
  message: 'part number is invalid'
};
ko.validation.registerExtenders();

function VM() {
  var self = this;
  self.modelNumber = ko.observable().extend({ required: true });
  self.stockNumber = ko.observable().extend({ required: true });
  self.vinNumber = ko.observable().extend({ required: true });

  self.partNumber = ko.observable({
    modelNumber: self.modelNumber,
    stockNumber: self.stockNumber
  }).extend({ partNumberValid: true });

  self.isPartNumberValid = ko.validatedObservable({
    modelNumber: self.modelNumber,
    stockNumber: self.stockNumber,
    vinNumber: self.vinNumber,
    partNumber: self.partNumber
  });

  self.message = ko.observable();

  self.save = function() {
    if (self.isPartNumberValid.isValid()) {
      self.message("saved");
    } 
    else {
      debugger;
      self.isPartNumberValid.errors.showAllMessages();
      self.message("not saved");
    }    
  };

}
ko.applyBindings(new VM());

【讨论】:

  • 顺便说一句,当我在我的代码中使用它时,我注意到async 验证不起作用。我不得不将 partNumber 从 observable 更改为 computedjsfiddle.net/yekr2ov2/19
  • 我遇到了和你一样的问题。你拯救了我的一天!
猜你喜欢
  • 2015-01-30
  • 2021-12-20
  • 2018-03-02
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多