0

我一直在玩这个小测试代码——我承认——它不是很有用,但我注意到callBackElement当第一次调用这个处理程序时,第一个处理程序中返回的值是未定义的。

我不知道为什么......所以我添加了一个解决问题的条件,但我仍然想了解为什么它会这样工作......

该脚本来自今天早些时候这篇文章中显示的一个想法,我评论了导致下面脚本中错误的行(它有点长,对此感到抱歉)并作为一种计时器/计数器运行以说明触发的能力以编程方式使用复选框的处理程序。

如果有人可以解释为什么这个条件是必要的?

    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;
    }

该应用程序如下所示:

在此处输入图像描述

并且可以在这里测试

编辑:工作解决方案是在将小部件添加到面板后触发处理程序(参见菲尔的回答),如下所示:

  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 回答