Javascript 淘汰验证扩展';仅当';可观测参数

Javascript 淘汰验证扩展';仅当';可观测参数,javascript,knockout.js,Javascript,Knockout.js,是否有一种方法可以扩展一个可观察的对象,使其仅在和可观察的对象为真时才被需要,并且可以跟踪更改 例如,我得到了一个自定义扩展器: ko.extenders.requiredOnlyIf = function (target, makeRequired) { target.HasError = ko.observable(); function validate(newValue) { if (makeRequired) { target.HasError(newValu

是否有一种方法可以扩展一个可观察的对象,使其仅在和可观察的对象为真时才被需要,并且可以跟踪更改

例如,我得到了一个自定义扩展器:

ko.extenders.requiredOnlyIf = function (target, makeRequired) {
target.HasError = ko.observable();

function validate(newValue) {
    if (makeRequired) {
        target.HasError(newValue ? false : true);
    } else {
        target.HasError(false);
    }
}

   validate(target());
   target.subscribe(validate);
   return target;
}
这可以观察到:

self.Field1 = ko.observable().extend({ requiredOnlyIf : self.Field2() });
self.Field2 = ko.observable().extend({ requiredOnlyIf : self.Field1() });
这些观察值是相互依赖的,因此,如果一个被填充,另一个也必须被填充。但是,扩展器只有在值第一次绑定时才能正常工作,但当任何可观测值发生更改时,扩展器都无法正常工作。

以下几点:

  • 设置扩展时,需要传递可观察对象,而不是可观察对象的内容。(在Field2存在之前,也不能基于Field2创建Field1。)
  • 您需要两个订阅,这样,如果对其中一个的更改使另一个无效,就会引起注意
  • (更新)您可以使用计算的
  • ko.extenders.requiredOnlyIf=函数(目标,makeRequired){
    target.HasError=ko.pureComputed(()=>{
    const otherHasValue=!!makeRequired();
    const targetHasValue=!!target();
    返回otherHasValue&!targetHasValue;
    });
    回报目标;
    }
    self={};
    self.Field1=ko.observable();
    self.Field2=ko.observable().extend({
    requiredOnlyIf:self.Field1
    });
    self.Field1.extend({
    requiredOnlyIf:self.Field2
    });
    ko.应用绑定(self)
    
    。无效{
    边框颜色:红色;
    }
    
    
    正是我想要的!!谢谢你告诉我关于订阅的事情,在某种程度上,我知道我必须订阅,但不知道如何订阅。非常感谢你。我刚刚意识到这应该是一个合理的选择。代码已更新。