頻繁地GAS用戶(me too)不使用ServerHandler.addCallbackElement方法或以不涵蓋所有控件的方式使用。具有ServerHandler.addCallbackElement方法的背景是什麼?
什麼是擁有這種方法的背景?爲什麼GAS開發人員介紹它?將所有輸入小部件值作爲參數傳遞給所有服務器處理程序會更簡單嗎?
documentation不提供這些問題的答案。
我看到以下原因
- 添加小窗口作爲回調元件在多個處理程序,其處理不同組的控制的情況下,減少了瀏覽器和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;
}
問題恰恰是爲什麼UIapp這樣設計的? (據我瞭解) –
可能因爲uiapp本身不是元素。所以你需要指定一個元素的名字。如果你通過頁面上的一個按鈕發送所有的HTML,那也是一樣的。但它會衝突的第一個標籤 – Thomas
@Sergeinsas是完全正確的。我很好奇爲什麼UIapp是以這種方式設計的。 – megabyte1024