Javascript KnockoutJS:使用dropdownlists验证多行的问题

Javascript KnockoutJS:使用dropdownlists验证多行的问题,javascript,knockout.js,Javascript,Knockout.js,所以我试着验证我点击按钮时的两个下拉列表。当下拉列表首次启动时,由于未选择任何内容,因此将使用未定义的值启动下拉列表。这就是我想要的。但是,当我在添加另一行之前单击add按钮验证下拉列表时,验证从未发生 JS ko.validation.init({ insertMessages: false, errorMessageClass: "ErrorLine" }); ko.validation.rules['bothUndefined'] = { getValue

所以我试着验证我点击按钮时的两个下拉列表。当下拉列表首次启动时,由于未选择任何内容,因此将使用未定义的值启动下拉列表。这就是我想要的。但是,当我在添加另一行之前单击add按钮验证下拉列表时,验证从未发生

JS

 ko.validation.init({
    insertMessages: false,
    errorMessageClass: "ErrorLine"
  });
  ko.validation.rules['bothUndefined'] = {
    getValue: function (o) {
      return (typeof o === 'function' ? o() : o);
    },
    validator: function (val, params) {
      var self = this;

      var anyOne = ko.utils.arrayForEach(params, function (param) {
        if (typeof param === "function") {
            return typeof param() === "undefined";
          } else {
            return (typeof param === "undefined");
          }
        });

      return (typeof anyOne !== "undefined");
    },
    message: 'Please select one change.'
  };
  ko.validation.registerExtenders();

function BookPossessionTransferVM() {
    var self = this;
.
.
.
    self.PossessionChanges  = ko.observableArray([]);
    self.PossessionChangesErrors  =  ko.validation.group(self.PossessionChanges(), { deep: true, live: true });
    self.PossessionChanges.push(new PossessionChangeVM(self.PossessionChanges().length +1))
.
.
.
self.addPossessionChange = function () {
      if (self.PossessionChanges().length < 1) {
        self.PossessionChanges.push(new PossessionChangesVM(self.PossessionChanges().length + 1,
          self.AllFrom()));
      } else {
        self.PossessionChangesErrors.showAllMessages();
      }
    }
}

 function PossessionChangeVM(possessionChangeId) {
    var self = this;

    self.possessionChangeId = ko.observable(possessionChangeId);
    self.SelectedFrom =  ko.validatedObservable();
    self.SelectedTo =  ko.validatedObservable();
self.IsValidRow = ko.pureComputed(function() {
      return typeof self.SelectedFrom !== "undefined" && typeof self.SelectedTo !== "undefined";
    }).extend({
      bothUndefined: {
        params: [self.SelectedFrom, self.SelectedTo]
      }
    });

    self.ChangeType = ko.pureComputed(function() {
      if (self.SelectedFrom() !== undefined && self.SelectedTo() !== undefined) {
        return 'Update';
      } else if (self.SelectedFrom() === undefined && self.SelectedTo() === undefined) {
          return '';
      } else if (self.SelectedFrom() === undefined) {
        return 'Add';
      } else if (self.SelectedTo() === undefined) {
        return 'Remove';
      } else { return ''; }
    });
  }
ko.validation.init({
insertMessages:false,
errorMessageClass:“ErrorLine”
});
ko.validation.rules['bothUndefined']={
getValue:函数(o){
返回(typeof o==='function'?o():o);
},
验证器:函数(val,params){
var self=这个;
var any=ko.utils.arrayForEach(参数,函数(参数){
if(参数类型==“函数”){
返回typeof param()=“未定义”;
}否则{
返回(typeof参数==“未定义”);
}
});
返回(任何人的类型!=“未定义”);
},
消息:“请选择一项更改。”
};
ko.validation.registerExtenders();
函数bookOccessionTransferVM(){
var self=这个;
.
.
.
self.positionchanges=ko.observearray([]);
self.PossessionChangesErrors=ko.validation.group(self.PossessionChanges(),{deep:true,live:true});
self.PossessionChanges.push(新的PossessionChangeVM(self.PossessionChanges().length+1))
.
.
.
self.addPossessionChange=函数(){
if(self.positionchanges().length<1){
self.positionchanges.push(新的positionchangesvm(self.positionchanges().length+1,
self.AllFrom());
}否则{
self.positionChangesErrors.showAllMessages();
}
}
}
函数PossessionChangeVM(possessionChangeId){
var self=这个;
self.possessionChangeId=ko.可观察(possessionChangeId);
self.SelectedFrom=ko.validatedObservable();
self.SelectedTo=ko.validatedObservable();
self.IsValidRow=ko.pureComputed(函数(){
返回self.SelectedFrom!=“未定义”&&typeof self.SelectedTo!=“未定义”;
}).延伸({
波顿定义:{
参数:[self.SelectedFrom,self.SelectedTo]
}
});
self.ChangeType=ko.pureComputed(函数(){
if(self.SelectedFrom()!==未定义和self.SelectedTo()!==未定义){
返回“更新”;
}else if(self.SelectedFrom()==未定义和self.SelectedTo()==未定义){
返回“”;
}else if(self.SelectedFrom()==未定义){
返回“添加”;
}else if(self.SelectedTo()==未定义){
返回“删除”;
}else{返回“”;}
});
}
单击“添加”按钮后,我希望
positionChangesErrors
会出现一个问题,因为它应该加载未定义的选项。但我什么也得不到。再次感谢你的帮助

编辑:
现在我已经完成了验证,但是一旦选择了一个下拉列表,我就无法清除验证以创建新行。问题是:

原来我没有正确的验证逻辑。这是新的修改

伊斯瓦利德罗变成了一个自命不凡的人

  self.IsValidRow = ko.pureComputed(function() {
      return (!(self.SelectedFrom() === undefined && self.SelectedTo() === undefined))
    }).extend({      bothUndefined: {}
    });
而验证变得更为重要

ko.validation.rules['bothUndefined'] = {
    getValue: function (o) {
      return (typeof o === 'function' ? o() : o);
    },
    validator: function (val) {
      return val;
    },
    message: 'Please select one change.'
  };
  ko.validation.registerExtenders();