我正在尝试使用动态行数构建FlexTable
。每行包含TextBox
。有一个按钮可以向表中添加新行。还有一个提交按钮,应该发送所有TextBox
个小部件进行处理。
我最初宣布了一个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
记录了Logger.log(handler.getType())
var的类型,并显示Generic
。我在不存在的id上调用app.getElementById(id)
,它再次返回Generic
类型的对象。
我做错了什么?感谢您对此进行调查。谢谢你的时间。
答案 0 :(得分:2)
是否有特定原因要将每个文本框添加为回调元素。如果不是,我建议您将Flextable添加为回调元素,并且Flextable中的所有元素都将在您的处理函数中被识别。
var handler = app.createServerHandler('handler12')
.addCallbackElement(flexTable);
答案 1 :(得分:1)
(Srik打败了我......)如果你将容器作为CallbackElement,你不需要将每个TextBox都作为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上提供了使用动态表单元素的更完整示例。