Javascript 在敲除中应用多个扩展器

Javascript 在敲除中应用多个扩展器,javascript,knockout.js,observable,extender,Javascript,Knockout.js,Observable,Extender,我有以下javascript代码 function AppViewModel(){ this.myValue = ko.observable().extend({ minNumber: "5"}).extend({ maxNumber: "20" }); } ko.extenders.minNumber = function(target, minValue){ target.hasError = ko.observable(); target.errorMessage

我有以下javascript代码

function AppViewModel(){
    this.myValue = ko.observable().extend({ minNumber: "5"}).extend({ maxNumber: "20" });
}

ko.extenders.minNumber = function(target, minValue){
    target.hasError = ko.observable();
    target.errorMessage = ko.observable();

    function validate(newValue){
        target.hasError(parseInt(newValue) < parseInt(minValue) ? true : false);
        target.errorMessage(parseInt(newValue) < parseInt(minValue) ? "MinVal" : "");
    }

    validate(target());

    target.subscribe(validate);

    return target;
};

ko.extenders.maxNumber = function(target, maxValue){
    target.hasError = ko.observable();
    target.errorMessage = ko.observable();

    function validate(newValue){
        target.hasError(parseInt(newValue) > parseInt(maxValue) ? true : false);
        target.hasError(parseInt(newValue) > parseInt(maxValue) ? "MaxVal" : "");
    }

    validate(target());

    target.subscribe(validate);

    return target;
};

ko.applyBindings(new AppViewModel());
函数AppViewModel(){
this.myValue=ko.observable().extend({minNumber:“5”}).extend({maxNumber:“20”});
}
ko.extenders.minNumber=函数(目标,最小值){
target.hasError=ko.observable();
target.errorMessage=ko.observable();
函数验证(newValue){
target.hasrerror(parseInt(newValue)parseInt(maxValue)?true:false;
hasError(parseInt(newValue)>parseInt(maxValue)-“MaxVal”:“”);
}
验证(target());
目标。订阅(验证);
回报目标;
};
应用绑定(新的AppViewModel());
和下面的HTML

<input data-bind="value: myValue, valueUpdate: 'afterkeydown'"/><br/>
<span data-bind="text: myValue"></span>
<span data-bind="text: myValue.errorMessage"></span>
<span data-bind="text: myValue.hasError"></span>

我试图实现的是对具有最小和最大整数值的可观察对象的验证。我的代码可以工作,但我不确定它为什么可以工作。例如,为什么maxNumber不能清除其validate函数中的errorMessage属性,即使在本例中整数小于5,也不能清除min函数中的errorMessage属性,反之亦然

这些函数的启动顺序是什么

就像我说的,它做了我想让它做的,但我不明白它是如何工作的,老实说,我从来没有想过它会工作

有人能帮我照一下吗

问候,,
Gary

我认为导致它“工作”的主要问题是您没有在
maxNumber
扩展器中设置
errorMessage
,因此它没有被不适当地清除:

function validate(newValue){
    target.hasError(parseInt(newValue) > parseInt(maxValue) ? true : false);
    target.hasError(parseInt(newValue) > parseInt(maxValue) ? "MaxVal" : "");
}

我已决定将extend方法中的可观察名称更改为与此小提琴中不同的名称,因为我不太乐意输入前面的代码,因为我不理解它是如何工作的。只是出于好奇,为什么不使用敲除验证?()如果您尝试过敲除验证,但决定不使用它,我想知道您的理由。嗨,Jeff,我没有使用敲除验证是出于各种原因,当时我只是做服务器端开发,所以整个javascript世界对我来说都是新的,所以掌握敲除本身就足够了。最重要的是,扩展一个可观测数据非常容易,随着验证的进行,我们需要更复杂的验证,即验证一个可观测数据取决于其他两个数据的值,然后进一步的要求意味着我们要使用传递给扩展方法的自定义函数验证一个可观测数据。在这一点上,截止日期像往常一样迫在眉睫。谢谢,是的,这是一个剪切粘贴错误。我想,虽然我仍然不应该这样做,因为我两次设置相同的子可观测值,一次在minValue检查中,一次在maxValue检查中?是的,对于您拥有的原始样本(拼写错误已修复),它们可能会对相同的可观测值进行冲突更新。