【发布时间】:2013-09-04 23:09:18
【问题描述】:
我对淘汰赛还很陌生,正在尝试弄清楚如何将我理解的两个部分组合在一起。
我需要:
- 相互依赖的项目。
- 项目的输入值验证。
例子:
- 我有
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 添加到第一个块中的计算中,它就不起作用,因为当HMSValidate 的validate 函数得到它的值时,它已经被改变了。
我已经让它在第一个块中工作了,方法是添加另一个 observable 来跟踪传递给计算的“原始”值,然后添加另一个使用该值来确定它是否是错误状态的计算,但是感觉不是很优雅。
有没有更好的办法?
【问题讨论】: