私が理解していることから、基本的に2つのことが必要です。
- 誰かが「endDate」を選択するたびに「days」フィールドを計算したい[もちろん「startDate」を選択したと仮定して]
- 誰かが「days」フィールドを変更するたびに「endDate」フィールドを再計算したい
これを解決する 1 つの方法は、「書き込み可能な」計算された Observable [http://knockoutjs.com/documentation/computedObservables.html]を使用することです。詳細についてはリンクを参照してください。ただし、一般的には、「書き込み可能な計算されたオブザーバブル」とは、「他の」オブザーバブルに基づいて値が「計算された」ものであり、その逆も同様です。
私は自由にあなたのフィドルを変更し、「日」を計算されたオブザーバブルとして変更しました。ご覧ください: http://jsfiddle.net/dJQnu/5/
this.days = ko.computed({
read: function () {
//debugger;
// here we simply need to calculate the days as => (days = endDate - startDate)
if (that.dateStart() && that.dateEnd()) {
var vacDayCounter = 0;
for (var curDate = new Date(that.dateStart()); curDate <= that.dateEnd(); curDate = curDate.addDays(1)) {
if (isDateCountsAsVacation(curDate)) {
vacDayCounter++;
}
}
//that.days(vacDayCounter);
return vacDayCounter;
}
},
write: function (newDays) {
if (newDays && !isNaN(newDays) && that.dateStart()) {
var tmpEndDate = new Date(that.dateStart())
appliedDays = 0;
while (appliedDays < newDays) {
if (isDateCountsAsVacation(tmpEndDate)) {
appliedDays++;
}
tmpEndDate = tmpEndDate.addDays(1);
}
if (tmpEndDate) {
that.dateEnd(tmpEndDate);
}
}
}
});
お気づきの場合は、読み取りおよび書き込み部分にコード (ロジック) を再利用しただけです。読み取り中は、オブザーバブル自体の値、この場合は「日」を「計算」しており、書き込み中 (ユーザーが実際の「日」入力値を変更するといつでも発生します)、「dateEnd」フィールドを再計算しています。
他にご不明な点がございましたら、お気軽にお問い合わせください。
お役に立てれば。
ありがとう。