2013-08-26 33 views
0

我正嘗試使用動態行數構建FlexTable。每行包含一個TextBox。有一個按鈕可將新行添加到表中。還有一個提交按鈕,應該發送所有TextBox小部件進行處理。通過調用app.getElementById(id)函數無法檢索ServerHandler

我已初步宣佈ServerHandler並添加到它的所有固定元素:

var handler = app.createServerHandler('handler12') 
    .addCallbackElement(fixedTextBox1) 
    .addCallbackElement(fixedTextBox2); 
handler.setId('myHandlerId'); 
button.addClickHandler(handler); 

請注意,我已經設定ID的處理程序。現在,當我處理添加新的TextBox(表中的行)時,我必須給處理程序調用addCallbackElement(newlyCreatedField)。否則,我不會在提交表單時將它作爲參數。

我這樣做:

var handler = app.getElementById('myHandlerId'); 
handler.addCallbackElement(newlyCreatedField); 

,但我得到了以下錯誤:

Error encountered: Cannot find function addCallbackElement in object Generic. 

我記錄的handler的類型var與Logger.log(handler.getType())和它說Generic。我在不存在的ID上調用app.getElementById(id),並且它再次返回一個Generic類型的對象。

我在做什麼錯?感謝您關注此事。感謝您的時間。

回答

1

(Srik打我吧...)你不需要在每次文本框爲CallbackElement,如果你有容器作爲CallbackElement。

您將需要保持包含的TextBox元素的名稱唯一,並跟蹤這些名稱。要做到這一點,你可以使用標籤,並隨時更新。

function doGet() { 
    var app = UiApp.createApplication(); 

    // FlexTable - use tag to count # rows. 
    var fTable = app.createFlexTable() 
        .setId('fTable') 
        .setTag('0'); 
    app.add(fTable); 

    // Button to add new row 
    var addRow = app.createButton('Add Row'); 
    app.add(addRow); 
    var addRowHandler = app.createServerHandler('addRowHandler'); 
    addRowHandler.addCallbackElement(fTable); 
    addRow.addClickHandler(addRowHandler); 

    // Submit button 
    var submit = app.createButton('Submit'); 
    app.add(submit); 
    var submitHandler = app.createServerHandler('submitHandler'); 
    submitHandler.addCallbackElement(fTable); 
    submit.addClickHandler(submitHandler); 

    return app; 
} 

function addRowHandler(e) { 
    var app = UiApp.getActiveApplication(); 

    var row = parseInt(e.parameter.fTable_tag); // Get row counter 
    var tBox = 'textBox'+row; 

    var textBox = app.createTextBox() 
        .setId(tBox) 
        .setName(tBox); 

    // Place new text box in FlexTable 
    var fTable = app.getElementById('fTable'); 
    fTable.setWidget(row, 0, textBox); 

    // Update row counter 
    fTable.setTag((++row).toString()); 

    return app; 
} 

function submitHandler(e) { 
    var app = UiApp.getActiveApplication(); 

    var rows = parseInt(e.parameter.fTable_tag); // Get row counter 

    // Log contents of all textBoxes in FlexTable 
    for (var row=0; row<rows; row++) { 
    var tBox = 'textBox'+row; 
    Logger.log(tBox+'='+e.parameter[tBox]); 
    } 

    return app; 
} 

Waqar的Apps Script Tutorial上提供了一個更完整的使用動態表單元素的示例。

+0

謝謝你的代碼示例。 –

2

是否有一個特定的原因,您爲什麼要添加每個文本框作爲回調元素。如果不是,我建議你添加Flextable作爲回調元素,Flextable中的所有元素將在你的處理函數中被識別。

var handler = app.createServerHandler('handler12') 
    .addCallbackElement(flexTable); 
+0

非常感謝。我從來沒有新的,我可以添加整個表作爲回調元素。 –