2011-02-28 121 views
0

我正在用PHP和JavaScript製作一個小日曆應用程序。要填充事件div的第一頁上,我運行這個功能:等待外部方法完成之前完成?

function populateEvents() { 

    $.ajax({ 
     type: "GET", 
     url: "populateEvents.php", 
     success: function(data, textStatus, XMLHttpRequest) { 
      $('#events').html(data); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert("Status: " + textStatus + ". Error thrown: " + errorThrown); 
     } 
    }); 
} 

很簡單,populateEvents.php做了大部分工作。

現在,當我想添加一個事件,我調用下面的函數:

function createEvent(u_id) { 
    var title = $("#titleInput").val(); 
    var type = $("#typeSelect").val(); 
    var location = $("#locationInput").val(); 
    var date = $("#inputDate").val(); 
    var time = $("#inputTime").val(); 
    var allday = $('#allDaySelect:checked').val() !== undefined ? '1' : '0'; 
    var duedate = type == 'todo' ? date : ''; 
    var notes = $("#inputNotes").val(); 
    var output = 'u_id=' + u_id + '&title=' + title + '&type=' + type + '&location=' + location + '&date=' + date + '&time=' + time + '&allday=' + allday + '&duedate=' + duedate + '&notes=' + notes; 


    $.ajax({ 
     type: "GET", 
     url: "addEvent.php", 
     data: output, 
     success: function(data, textStatus, XMLHttpRequest) { 
      if (data == '') { 
       toggleNewEvent(); 
       populateEvents(); 
      } else { 
       // extract form problems from formProblems, in form: title=empty&date=empty&... 

       var errorArray = data.split("&"); 
       var fields = ''; 
       $.each(errorArray, function(index, value) { 
        var field; 
        var smallArray = value.split("="); 
        field = smallArray[0]; 
        fields = fields + field + ', '; 
       }); 
       alert('You must fill in the following fields: ' + fields); 
      } 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      alert("Status: " + textStatus + ". Error thrown: " + errorThrown); 
     } 
    }); 
} 

有點複雜,但我敢肯定,你得到的要點。發送到addEvent.php的值,解析的返回字符串等,重新填充事件。現在,我只重構了整個PHP端,實現了一個eventlist類和一個事件類。此前,addevent.php文件做了所有實際的後臺工作,但現在,該文件(一些驗證後)歸結爲:

if ($return == '') { 
     /*If return is empty, everything is fine, carry on.*/ 
     $eventlist->addEvent($u_id, $title, $type, $date, $time, $allday, $location, $dueby, $notes); 
    } else { 
     /*Throw an error*/ 
     echo ($return); 
    } 

結果但是,此文件返回給JavaScript函數時,它發送的請求eventlist對象執行addEvent方法。該函數然後嘗試立即填充事件div,因此它不起作用,因爲addEvent方法尚未完成。但是,當你刷新頁面時,它工作正常,所以我知道它正確地插入它們,它只需要等待第二個PHP文件完成。

+0

請.. **不要使用字符串作爲'data'參數**。你可以傳遞一個對象,這將減輕你不必關心逃跑的事情。 – ThiefMaster 2011-02-28 11:06:10

+0

如何在javascript和php之間傳遞一個對象。 – 2011-02-28 11:11:36

+0

他意味着'output'變量應該是一個json對象,這樣jquery將會跳過任何文本並傳遞正確的數據,例如。 '{u_id':1,'title':'這是我的標題'}' – Val 2011-02-28 11:29:27

回答

1

爲什麼不將$eventlist->addEvent($u_id, $title, $type.......部分返回到腳本 echo $eventlist->addEvent($u_id, $title, $type.......

然後在您的addEvent方法中返回一些內容,即事件的ID。

然後,而不是檢查的頁面是空白的,你檢查的ID if (!isNaN(data)) isNotANumber,因此你知道你已經完成了你的插入事件作爲你的頁面不會返回,直到它有ID。

+0

這是一個很棒的主意,只要我能把它運用起來。我從addEvent.php中得到以下錯誤: 調用第44行的/home/content/53/7316853/html/organiser/home/addEvent.php中的非對象的成員函數addEvent() 第44行是:$ return = $ eventlist-> addEvent($ u_id,$ title,$ type,$ date,$ time,$ allday,$ location,$ dueby,$ notes); – 2011-02-28 11:47:13

+0

不要緊,我使用一個會話變量來存儲我的事件列表對象的序列化版本,並且我的會話過期:P – 2011-02-28 11:49:41