经常 GAS 用户(我也是)不使用ServerHandler.addCallbackElement方法或以不涵盖所有控件的方式使用。
有这种方法的背景是什么?为什么 GAS 开发者要引入它?将所有输入小部件值作为参数传递给所有服务器处理程序是否更简单?
文档没有提供这些问题的答案。
我看到以下原因
- 在处理不同控件集的多个处理程序的情况下,添加小部件作为回调元素可以减少浏览器和 GAS 服务器之间的流量。这是一个问题。它节省了多少流量?我认为最多几千字节,通常是数百字节。考虑到现代互联网连接速度,甚至移动连接,是否值得。
- 表单包含带有多个按钮的类似表格的编辑控件,并且可以轻松处理具有相同名称的行元素。这个问题很容易通过使用来避免
tags
。请参阅以下示例。如果标签用于其他目的,解析源按钮 id 并提取行号不是问题。 - 幕后使用的技术限制。如果有这样的限制,那么它们是什么?
function doGet(e) {
var app = UiApp.createApplication();
var vPanel = app.createVerticalPanel();
var handler = app.createServerHandler("onBtnClick");
var lstWidgets = [];
for (var i = 0; i < 10; i++) {
var hPanel = app.createHorizontalPanel().setTag('id_' + i);
var text = app.createTextBox().setName("text_" + i);
text.setText(new Date().valueOf());
var btn = app.createButton("click me").addClickHandler(handler);
btn.setTag(i).setId('id_btn' + i);
var lbl = app.createLabel().setId("lbl_" + i);
hPanel.add(text);
hPanel.add(btn);
hPanel.add(lbl);
lstWidgets.push(text);
lstWidgets.push(btn);
vPanel.add(hPanel);
}
// The addCallbackElement calls simulate situation when all widgets values are passed to a single server handler.
for (var j = 0; j < lstWidgets.length; j++) {
handler.addCallbackElement(lstWidgets[j]);
}
app.add(vPanel);
return app;
}
function onBtnClick(e) {
var app = UiApp.getActiveApplication();
var i = e.parameter[e.parameter.source + '_tag'];
var lbl = app.getElementById("lbl_" + i);
lbl.setText("Source ButtonID: " + e.parameter.source + ', Text: ' + e.parameter["text_" + i]);
return app;
}