多くの場合、 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;
}