我对淘汰赛还很陌生,并且正在尝试弄清楚如何将我理解的两部分放在一起。
我需要:
- 相互依赖的项目。
- 项目的输入值验证。
例子:
- 我有
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
函数获取它已经被更改的值。
我通过添加另一个可观察到的来跟踪传递给计算的“原始”值,然后添加另一个使用该值来确定它是否是错误状态的计算,从而使其在第一个块中工作,但这不是感觉很优雅。
有没有更好的办法?