2011-02-15 25 views
0

我正在爲一組應用程序設計一個AJAXy表單生成Javascript庫,其中回調行爲應該根據應用程序而有所不同。我暴露API函數採取一組附加功能,以標準的形式中發生的各種按鈕和其他事件的回調:我如何傳遞封閉的函數作爲它自己的JavaScript遞歸回調?

  • onLoadCallback [當形式完全加載]
  • onSaveCallback [時節省成功處理]
  • onCancelCallback [當取消按鈕被點擊]
  • busyCallback [每當AJAX操作正在進行]
  • readyCallback [當AJAX操作結束]

例如,一個應用程序想要在新的彈出窗口中呈現此表單,而另一個應用程序則希望它在現有頁面上內聯。在彈出的場景中,onSaveCallback將關閉彈出窗口並將消息發佈到啓動頁面。在內聯場景中,onSaveCallback應通過重新運行該函數來重新加載表單內容。

有沒有一種標準的,簡單的方法來做這種遞歸回調,而不是兩次寫入函數,如下所示?

MyFormLibrary.displayForm(
    div, 
    formName, 
    query, 
    onLoadCallback, 
    function onSaveCallback(result) { 
     MyFormLibrary.displayForm(
     div, 
     formName, 
     query, 
     onLoadCallback, 
     onSaveCallback, 
     onCancelCallback, 
     busyCallback, 
     readyCallback); 
    }, 
    onCancelCallback, 
    busyCallback, 
    readyCallback); 

回答

2

給它一個名字。在上面的情況下,你可以把它叫做onSaveCallback。只需將該名稱用於外部功能,並將其稱爲onSaveCallbackarguments.callee也應該工作,如果有一個原因,你不能給它一個名字。

MyFormLibrary.displayForm(
    div, 
    formName, 
    query, 
    onLoadCallback, 
    arguments.callee, 
    onCancelCallback, 
    busyCallback, 
    readyCallback); 
+0

,完美的工作 - 謝謝!我以爲我之前曾嘗試過,但我可能做得太過複雜,失敗了。此外,現在我將回調包裝在單個對象中以簡化代碼,這實際上使得這種效果更好。 – Jon 2011-02-15 16:38:51

0

把你調用一個函數裏面,所以你可以遞歸調用它:

function recursiveSaveCallback (result) { 
    MyFormLibrary.displayForm(
     div, 
     formName, 
     query, 
     onLoadCallback, 
     recursiveSaveCallback, 
     onCancelCallback, 
     busyCallback, 
     readyCallback 
    ); 
} 

recursiveSaveCallback(result);