3

ajax投稿の後にイベントを更新して、イベントのタイトルを変更し、色を変更できるようにクラスを与えようとしています。また、JSONソースからのイベントが承認されているかどうか、承認されている場合は色を変更したかどうかもお知らせします。私は以下の私のコードにコメントしました:

更新されたコード:

$(document).ready(function () {

var liveDate = new Date();
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();






var calendar = $('#calendar').fullCalendar({
    disableDragging: true,
    header: {
        left: 'prev,next today',
        center: 'title',
        right: 'year'
    },


    eventClick: function (calEvent, jsEvent, view, eventid) {

        var eventid = calEvent.id;
        var start = calEvent.start;
        var end = calEvent.end;
        var fullname = calEvent.fullname;


        var fancyContent = ('<div class="header">approve booking for ' + eventid + calEvent.title + '<a href="#" class="approve" id="' + eventid + '">yes</a><a href="#" class="approve">no</a></div>');
        $.fancybox({
            content: fancyContent
        });

        var getid = $('.approve').attr('id');

        // approve function
      
        $('.approve').click(function (calEvent, jsEvent, view, getid) {
            var getid = $('.approve').attr('id');


            if ($(this).html() == "yes") {

                // AJAX post to insert into DB 
              
                $.post("ajax.php", {
                    action: 'approve',
                    eventid: getid,
                    color: 'green'
                },

                function (data) {
                    var fancyContent = ('<div class="header"><p>' + data.msge + '</p></div>');
                    $.fancybox({
                        content: fancyContent
                    });
                }, "json");
              
              // attemping to add class to event to change color, this does not work

                $('#calendar').fullCalendar('clientEvents', calEvent).addClass('fc-event-updated');
             
              
              // trying to get id from last updated event so I can change it but this also does not work

                var eventObject = $('#calendar').fullCalendar('clientEvents', eventid);

                if (eventObject != null) {
                    eventObject.title = fullname + ' approved';
                    eventObject.color = 'green';


                    $('#calendar').fullCalendar('updateEvent', eventObject);
                }


            } else {
                // close fancybox
              
                $.fancybox.close();
              
            } // end of  if

        }); // end of approve click


    },

    selectable: true,
    selectHelper: true,
    select: function (start, end, allDay, approved, title) {


        // disable booking dates in the past
      
        if (liveDate > start) {
            var fancyContent = ('<div class="header">Canot book dates in the past</div>');
            $.fancybox({
                content: fancyContent
            });

            return false;

        } else {

            // get user to confirm selection
          
            var fancyContent = ('<div class="header">Book the following days off</div>Start Time: </b></label>' + $.fullCalendar.formatDate(start, "yyyy-MM-dd") + '<br>' + '<label><b>End Time: </b></label>' + $.fullCalendar.formatDate(end, "yyyy-MM-dd") + '<br>' + '<label><a href="#" class="button">yes</a><a class="button" href="#">no</a></div>');
            $.fancybox({
                content: fancyContent
            });


            $('.button').click(function () {

                if ($(this).html() == "yes") {
                  
                    // ajax to insert into DB 

                    $.post("ajax.php", {
                        start: $.fullCalendar.formatDate(start, "yyyy-MM-dd"),
                        end: $.fullCalendar.formatDate(end, "yyyy-MM-dd"),
                        action: 'add',
                        userid: userid
                    },

                    function (data) {

                        // render event an insert id generated from query
                      
                        calendar.fullCalendar('renderEvent', {
                            id: data,
                            title: fullname + 'pending approval',
                            start: start,
                            end: end,
                            className: 'unapproved'
                        },
                                              
                        false // make the event "stick"     
                                              
                        );
                

                    }, "json");

                    // close fancybox
                  
                    $.fancybox.close();


                } else {
                    // close fancybox
                  
                    $.fancybox.close();
                  
                } // end of  if
              
            });


            //if ajax post successful then show booking on page - not sure how to get value from previous fancybox

        } // end liveDate > start else

        calendar.fullCalendar('unselect');
    },
    editable: true,


    eventSources: [

    // event sources from json
      
    {
        url: 'json-events.php',
        type: 'POST',
        error: function (data) {
            alert('there was an error while fetching events!' + data.msge);
        },


    // if event is approved = 1 then change color and title of event. This does not work

        success: function (data) {
            var event = data.approved;

            if (data.approved == "1") {

                var title = title + "approved";
                var className = "approved";

            } else {

                var title = title + "awaiting approval";
              
                var className = "unapproved";

            }
        }

    }



    ]



});

});
4

2 に答える 2

9

古いイベントをカレンダーから削除し、更新された情報で再作成することでこれを解決しました。

注:望ましくない動作を避けるために、各イベントに一意の ID を割り当てるようにしてください。

次に例を示します。

$('#calendar').fullCalendar( 'removeEvents', [5] );

$('#calendar').fullCalendar( 'renderEvent', {
    id: 5,
    title: 'Some Title',
    start: '2013-03-30',
    end: '2013-03-30',
    className: 'fancy-color'
}, true );
于 2013-03-30T18:29:07.943 に答える
2

特定のイベントのスタイル/外観を誤って変更しようとしています。

fullCalendar の場合、正しいコード フローは次のとおりです。

  1. ajax でイベントを取得/更新/作成します (つまり、クリックまたは eventSources オプションを介して)。
  2. eventClick コールバックを使用して、イベントのクリックを処理します(例のように)。
  3. fullCalendar('clientEvents', your_event) (あなたの例のように) を介して元のイベントを見つけます。
  4. 元のイベントを ajax リクエストからの新しいデータで拡張します (または、以下の簡単な例のようにハードコードされた変数を介して)。
  5. fullCalendar( 'updateEvent', your_event) を介して更新されたイベントを fullCalendar に通知します。そうすることで、fullCalendar はイベントを内部的に更新し、イベント (および他のイベントの配置) をカレンダーに再レンダリングします。
  6. eventRender fullCalendar コールバック関数を利用して、レンダリング時にどのイベントがどのスタイル/css クラスを取得するかを決定します。

元の例が機能しなかった理由は、クラスをイベントに追加しようとするたびに、完全なカレンダーに更新が通知されないためです (fullCalendar は、すべての属性/クラス/その他のバインディング/ウォッチを作成しません)。すべてのイベントと応答を動的に...それは少しばかげている/メモリを浪費するでしょう)。ここで fullCalendar( 'updateEvent', your_event) が役に立ちます。また、最初にeventRenderコールバックを使用してクラスを追加する必要があります。イベントの更新/再レンダリングが発生するたびに、実際のイベント要素自体は同じではなく、fullCalendar がイベント用に保存したイベント オブジェクトは同じしたがって、再適用するクラス/スタイルを決定しますeventRenderコールバックを介して、再レンダリングが発生したとき。

これは非常に簡単な例です:

var cal = $("#calendar");
cal.fullCalendar({
  eventClick: function(event){
     // you can do an ajax request here if you want, which is what
     // you might do if you are trying to lazy-load event information
     // as a performance optimization upon initiliation of the calendar, 
     // but for simplicities sake, I'm just hard coding it. 
     event.loading = true;
     event.site = "internal";
     event.category_list = [{name:"Fun Event Tag", bgc:"red"}, 
                           {name:"Crappy Event Tag", bgc:"black"}];
     // Calling updateEvent updates the original event with the data you just
     // set above, and then rerenders it to the calendar, and your eventRender
     // callback is called:
     cal.fullCalendar('updateEvent', event);
  },
  eventRender: function(event, element) {
    // event.site and event.loading are simply supplemental data
    // that I've added to the original full calendar event object(s)
    if(event.site == 'internal' && event.loading){
      element.addClass("loading");
      element.find(".fc-content").prepend("<i class='spinner-dark'>");
    }

    if(event.id == panel_showing_event_id){
      element.addClass("showing");
    }

    // event.category_list is an array that I have also attached
    // to the original event object(s), to show that supplemental arrays/objects
    // that are set on the original event object(s) persist as well
    if(event.category_list && !!event.category_list.length){
      for(i = 0; i < event.category_list.length; i++){
        var tag = event.category_list[i];
        element.css("background-color", tag.bgc);
      }
    }else{
      element.css("background-color", "");
    }
  }

完全な説明が必要な場合はお知らせください。ただし、これで元に戻るはずです。

于 2014-12-19T18:53:20.933 に答える