我对淘汰赛还很陌生,并且正在尝试弄清楚如何将我理解的两部分放在一起。
我需要:
- 相互依赖的项目。
- 项目的输入值验证。
例子:
- 我有
startTime几秒钟,duration几秒钟,stopTime这是从startTime + duration startTime无法改变duration并stopTime绑定到输入字段stopTime以HH:MM:SS格式显示和输入- 如果用户发生变化
stopTime,duration应计算并自动更新 - 如果用户发生变化
duration,stopTime应计算并自动更新
我可以让它们相互更新(假设Sec2HMS和HMS2Sec在别处定义,并在HH:MM:SS和秒之间转换):
this.startTime = 120; // Start at 120 seconds
this.duration = ko.observable(0);
// This dependency works by itself.
this.stopTimeFormatted = ko.computed({
read: function () {
return Sec2HMS(this.startTime + parseInt(this.duration()), true);
},
write: function (value) {
var stopTimeSeconds = HMS2Sec(value);
if (!isNaN(stopTimeSeconds)) {
this.duration(stopTimeSeconds - this.startTime);
} else {
this.duration(0);
}
},
owner: this
});
或者,我可以使用extenders或fn验证输入,如淘汰文档中所示:
ko.subscribable.fn.HMSValidate = function (errorMessage) {
//add some sub-observables to our observable
var observable = this;
observable.hasError = ko.observable();
observable.errorMessage = ko.observable();
function validate(newValue) {
var isInvalid = isNaN(HMS2Sec(newValue));
observable.hasError(isInvalid ? true : false);
observable.errorMessage(isInvalid ? errorMessage : null);
}
//initial validation
validate(observable());
//validate whenever the value changes
observable.subscribe(validate);
//return the original observable
return observable;
};
this.startTime = 120; // Start at 120 seconds
this.duration = ko.observable(0);
this.stopTimeHMS = ko.observable("00:00:00").HMSValidate("HH:MM:SS please");
但是我如何让他们一起工作呢?如果我将它添加HMSValidate到第一个块中的计算它不起作用,因为到 timeHMSValidate的validate函数获取它已经被更改的值。
我通过添加另一个可观察到的来跟踪传递给计算的“原始”值,然后添加另一个使用该值来确定它是否是错误状态的计算,从而使其在第一个块中工作,但这不是感觉很优雅。
有没有更好的办法?