0

3つのフィールドを持つビューモデルがあります

dateStart = ko.observable();
dateEnd = ko.observable();
days = ko.observable();

startDate が選択されていると仮定すると、endDate が選択されるたびに、days フィールドを更新する必要があります (days = endDate - startDate)。

また、日フィールドが更新されると、endDate (endDate = startDate + days) を計算する必要があります。

これは knockoutjs でどのように行うことができますか?

ありがとう!

http://jsfiddle.net/NfG4C/6/を試しまし たが、私のjsは常に再帰例外をスローします。

4

2 に答える 2

3

私が理解していることから、基本的に2つのことが必要です。

  1. 誰かが「endDate」を選択するたびに「days」フィールドを計算したい[もちろん「startDate」を選択したと仮定して]
  2. 誰かが「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」フィールドを再計算しています。

他にご不明な点がございましたら、お気軽にお問い合わせください。

お役に立てれば。

ありがとう。

于 2013-03-17T14:07:16.833 に答える
1

サブスクリプションからオブザーバブルを更新すると、そのオブザーバブルのサブスクライブメソッドもトリガーされるため、再帰的な問題が発生します。

4 番目のメンバー updatedFromSubscriber を追加する必要があります

最初からfalseに設定し、各subscribeメソッドで追加します

if(this.updatedFromSubscriber)
 return;

オブザーバブルを更新する直前に

this.updatedFromSubscriber = true

オブザーバブルを更新した後、 false に設定します

于 2013-03-17T11:59:51.320 に答える