我是相當新的淘汰賽,並試圖弄清楚如何把兩件我一起理解。敲除計算和輸入驗證
我需要:
- 項目依賴於對方。
- 對項目的輸入值驗證。
實施例:
- 我在秒
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
的函數獲取值時它已被更改。
我已經通過添加另一個observable來跟蹤傳遞到計算中的「raw」值,然後添加另一個使用該值來判斷它是否爲錯誤狀態的計算,但它已在第一個塊中工作,但那並不覺得很優雅。
有沒有更好的方法?
http://jsfiddle.net/cygnl7/njNaS/2/