0

私はこの小さなテスト コードをいじっていますが、これはあまり役に立ちませんがcallBackElement、このハンドラーが初めて呼び出されたときに、最初のハンドラーの で返される値が定義されていないことに気付きました。

理由がわかりませんでした...そのため、問題を解決する条件を追加しましたが、なぜこれがそのように機能するのかを理解したいと思います...

スクリプトは、今日のこの投稿で示されているアイデアから来ています。以下のスクリプトでエラーを引き起こす行にコメントしました (少し長いので、申し訳ありません)。起動する機能を示すために、一種のタイマー/カウンターとして実行されます。 checkBoxes を使用したプログラムによるハンドラー。

誰かがこの条件が必要な理由を説明できますか?

    var nn=0;
    //
    function doGet() {
      var app = UiApp.createApplication().setHeight('120').setWidth('200').setTitle('Timer/counter test');
      var Panel = app.createVerticalPanel()
      var label = app.createLabel('Initial display')
                     .setId('statusLabel')
      app.add(label);
      var counter = app.createTextBox().setName('counter').setId('counter').setValue('0')
      var handler1 = app.createServerHandler('loadData1').addCallbackElement(Panel);
      var handler2 = app.createServerHandler('loadData2').addCallbackElement(Panel);
      var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setValue(true,true).setId('chk1');
      var chk2 = app.createCheckBox('test2').addValueChangeHandler(handler2).setVisible(true).setValue(false,false).setId('chk2');
      app.add(Panel.add(chk1).add(chk2).add(counter));
      SpreadsheetApp.getActive().show(app)
    }

    function loadData1(e) {
      var app = UiApp.getActiveApplication();
      var xx = e.parameter.counter
//*******************************************************
      if(xx){nn = Number(xx)}; // here is the question
    //  nn = Number(xx);       // if I use this line the first occurence = undefined
      nn++
      var cnt = app.getElementById('counter').setValue(nn)
      Utilities.sleep(500);
      var chk1 = app.getElementById('chk1').setValue(false,false)
      var chk2 = app.getElementById('chk2').setValue(true,true)
      var label = app.getElementById('statusLabel');
      label.setText("Handler 1 :-(");

      return app;
    }

    function loadData2(e) {
      var app = UiApp.getActiveApplication();
      var xx = Number(e.parameter.counter)
      xx++
      var cnt = app.getElementById('counter').setValue(xx)
      Utilities.sleep(500); 
      var chk1 = app.getElementById('chk1').setValue(true,true)
      var chk2 = app.getElementById('chk2').setValue(false,false)
      var label = app.getElementById('statusLabel');
      label.setText("Handler 2 ;-)");

      return app;
    }

アプリは次のようになります。

ここに画像の説明を入力

ここでテスト可能です

編集:有効な解決策は、次のようにウィジェットをパネルに追加した後にハンドラーを起動することです (Phil の回答を参照)。

  var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setId('chk1');
  var chk2 = app.createCheckBox('test2').addValueChangeHandler(handler2).setVisible(true).setId('chk2');
  app.add(Panel.add(chk1).add(chk2).add(counter));
  chk1.setValue(true,true);
  chk2.setValue(false,false);
  return app
4

1 に答える 1

0

そのハンドラに指定したコールバック要素 ( Panel) には、呼び出された時点で要素がありません。したがって、基本的に空のパネルをそのハンドラーに渡します。そのためchk1、まだパネルに追加されていないため、その値はパラメーターとしてハンドラーに追加されません。

への呼び出しのchk1.setValue(true,true) に置きPanel.add(chk1)ます。

この例に見られるように、ハンドラーは呼び出されるとキューに入れられます。setValue(true,true)これは、ハンドラーに渡されるすべてのパラメーターが収集されることを意味します。コールバック要素を見て、それらの値を読み取りdoGet . 終了後doGet、ハンドラーが実行されます。

于 2013-02-10T03:12:47.553 に答える