1

こんにちは私はFullCalendarアプリで重複するイベントを避けようとしています。重複するイベントをチェックするようにコールバックを定義し、変更してそれに応じてを呼び出すeventDropことにより、現在移動されているイベントを重複するイベントの最後に移動します。event.startevent.end.fullCalendar('updateEvent', event)

これが私のコードです。moment呼び出しはhttp://momentjs.com/docs/であり、これはjavascriptの時間処理機能ライブラリであり、問​​題の原因ではないと思います。する行をコメントするとevent.start = start; event.end = end、すべて正常に機能します。そうしないと、電話するかどうかに関係なく、まったく同じように壊れupdateEventます。何が起こるか:イベントは前のイベントの最後に移動しますが、後でイベントを前に移動しようとすると(その日の後半に空のスペースに)、前のイベントは新しい開始まで視覚的に延長されます現在変更中のイベント。

self.collectionはバックボーンコレクションであるため、少しコメントを付けてこのコードを呼び出すとevent.start=、イベントが重複していることが示されますが、ページを更新すると、イベントは適切な場所に表示されます(重複していません)。

eventDrop: function(event, dayDelta,
                    minuteDelta, allDay,
                    revertFunc, jsEvent, ui, view) {
    var start = moment(event.start);
    var end = moment(event.end);
    var overlap = self.calendar.fullCalendar('clientEvents', function(ev) {
        if( ev == event)
            return false;
        var estart = moment(ev.start);
        var eend = moment(ev.end);
        return estart.unix() < end.unix() && eend.unix() > start.unix();
    });
    if( overlap.length ) {
        overlap = overlap[0];
        var estart = moment(overlap.start);
        var eend = moment(overlap.end);
        var duration = eend - estart;
        start = eend;
        end = start.clone();
        end.add(duration);
        event.start = start.toDate();
        event.end = end.toDate();
        self.calendar.fullCalendar('updateEvent', event);
    }
    event.model.save({start: start.unix(), end: end.unix()});
},
4

2 に答える 2

1

OK、問題が見つかりました。

言う行

start = eend;

する必要があります

start = eend.clone();

オブジェクトでラップしてmomentも実行されないため、参照を保持するだけで、新しく移動されたイベントのstart日付をと同じDate オブジェクトに設定します。overlap.end

于 2013-03-26T20:12:00.817 に答える
0

あなたは別の間違いを持っ​​ています、期間は

var duration = end - start;

あなたのアプローチでは、移動したばかりのイベントではなく、重複するイベントの期間を計算するためです。

于 2013-03-29T11:57:32.207 に答える