0

多くの場合、 GASユーザー(私も)は、ServerHandler.addCallbackElementメソッドを使用したり、すべてのコントロールをカバーしていない方法で使用したりしません。

この方法を使用する背景は何ですか?なぜGAS開発者はそれを導入したのですか?すべての入力ウィジェット値をパラメーターとしてすべてのサーバーハンドラーに渡す方が簡単ですか?

ドキュメントには、これらの質問に対する回答は含まれていません。

次のような原因があります

  1. コールバック要素としてウィジェットを追加すると、異なるコントロールのセットを処理する複数のハンドラーの場合に、ブラウザーとGASサーバー間のトラフィックが減少します。ここに質問があります。どのくらいのトラフィックを節約できますか?最大で数キロバイト、通常は数百バイトだと思います。現代のインターネット接続速度、さらにはモバイル接続を考えると、それは価値があります。
  2. フォームには、複数のボタンを備えたテーブルのような編集コントロールが含まれており、同じ名前の行要素を快適に処理できます。この問題は、を使用することで簡単に回避できtagsます。次の例を参照してください。タグが他の目的で使用されている場合は、ソースボタンIDを解析して行番号を抽出することは問題ありません。
  3. 舞台裏で使用される技術の限界。そのような制限がある場合、それらは何ですか?
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;
}
4

2 に答える 2

3

素晴らしい質問です。

「どれだけのトラフィックを節約できますか?」まだわからないと思いますが、時間の経過とともに効率が上がると思います。これがパフォーマンスに関する別の議論です。Googleによる広範なテストと改善によってのみ、ベストプラクティスを特定できます。今のところ、ClientHandlerは可能な限りServerHandlerよりも明らかに優れていると言えます。

JavaScript開発者として、私たちは主にクライアント側での作業に慣れていると思います。次に、PHP/ASPをサーバー側のツールと考えます。これまでの私の理解では、GASコードは実際にはクライアント側とサーバー側の両方で実行されています(少なくともサーバー側の機能を呼び出しています)が、サーバー側では、私たちが認識しているよりも多くのことが行われているようです。これにより、いくらか「コンパイルされた」コードが生成されるようです。私のJavaの経験から、この多層デプロイメントのいくつかを認識しています。

同じことを行う方法はたくさんあるので、Googleは、コードが(どちらの側でも)直接解釈されないという事実を利用して、コードを手動で記述した場合に必ずしも意味をなさないことを行うことができます。これが、他のソリューションよりも効率的になると思う理由ですが、最終的にはまだではないでしょう。今のところ、パフォーマンスが心配な場合は、GASを避けて操縦することをお勧めします。たぶん楽しみのために、実行時にクライアント側のWebアプリのソースを調べてみてください(ソースを表示)。ですから、彼らが最も効率的に物事を行うためには、私たちに非常に高レベルの方法で物事を定義させることで彼らが恩恵を受けると思います。これにより、コードの解釈方法に最も柔軟性があります。

2番目の質問に具体的に対処するために、私は個人的にハンドラー関数onBtnClick()をサーバー側で実行されていると考えていますが、参照するタグ(およびほとんどのdoGet)はクライアント側のブラウザーのエンジンにあります。特定のイベント/リクエストを処理するために必要なメモリの量について事前に把握していれば、サーバー側で機能がはるかに柔軟(効率的かつ強力)になることがわかります。(明らかに、各getElementById()呼び出しが個別のリクエストを実行していた場合、それは毎回新しいミニWebページへのリンクをクリックするようなものです。)

では、なぜハンドラーは、ハンドラー関数で使用するものだけでパラメーターを自動的に作成できないのでしょうか。そもそもこの質問をしている唯一の理由は、UiAppに両端で利用できるように見えるものがあるからです。UiAppはすでにdoGetとonClickの両方のスコープに含まれていますが、doGetで定義された変数は含まれていないため、これらの値は次のいずれかである必要があります。

  • ScriptProperties.setProperty()またはのように明示的に保存されます
  • Idまたは
  • addCallbackElement()を使用してHandler関数に明示的に与えられます

UiAppオブジェクト内のapp.create...コンストラクターで作成されていないため、addCallbackElement(lstWidget)がどのように追加されたかに注意してください。私の推測では、GASはGoogle側のWebサービスへのXML準拠のSOAP呼び出しを実装していると思います。クライアント側のソースコードを実際に調べることで、これを理解できる可能性があります。繰り返しになりますが、setProperty()を使用することもできますが、実際には問題ではありません。JDBCを介して保存し、ハンドラー関数内から別の接続で取得することもできますが、どういうわけか、データをクライアントからサーバーに渡す必要があります。 -その逆。

プログラミングの観点から、クライアント側のdoGet関数のスコープには、おそらくサーバーに渡したくないものがたくさんあります。または、サーバー側のdoClick()のスコープに関数がある場合もあります。クライアント側の関数と同じ名前ですが、実際にはまったく異なるライブラリ関数の呼び出しである可能性があります(開発者の観点からは同じように機能しますが)。

たぶん、Googleチームは、UiAppが実際にどのように機能するかをまだ実際に決定していません。そうでなければ、強制するか、少なくともすべてをそこに入れることを許可します。名前に基づいてUiApp.getActiveApplication()を呼び出すと、コンストラクターではなく、UiAppオブジェクトからプライベートインスタンスを返すメソッドのように見えます。(オブジェクトは以前にインスタンス化され、おそらくどこかで初期化されたクラスです。)私はあなたの質問に100%答えていないかもしれませんが、私は確かに試みました、コミュニティからのさらなる洞察は明らかにありがたいです。

今は話題から外れているかもしれませんが、実際の製品は長期的にパフォーマンスを向上させるためにさらに変化し続けると思います。それでも開発者としてクライアント側のコードを書いていると感じたら、 Googleの成功です。何か間違ったことを言った場合は訂正してください。最近これらのツールを使い始めたばかりで、詳細を確認しながらこの質問をフォローアップする予定ですが、現時点ではそれが最善の解釈です。

于 2012-12-01T20:51:59.057 に答える
0

フォームパネルを使用すると、すべてのサブ要素がdopost関数に送信されます。ボタンをソースとして使用します。そして、UIappがクリーンアップされます。

それを望まない場合は、コールバックを使用して、送信される要素と兄弟を指定します。

これがUIappの設計方法です。

于 2012-10-12T19:38:38.443 に答える