1

我创建了一个带有 2 个文本框和 1 个按钮的简单 GUI。按钮处理程序如下

function handleButton1(e) 
{
    var app = UiApp.getActiveApplication();
    var v1 = e.parameter.TextBox1;
    var v2 = e.parameter.TextBox2;
    Logger.log(v1);
    app.getElementById("TextBox1").setText(v2);
    app.getElementById("TextBox2").setText(v1);
    return app;
}

当我运行应用程序时,文本框的值为 TextBox1 和 TextBox2。当按下按钮时,显示的两个文本框值都是未定义的。我哪里错了。

4

1 回答 1

2

对于服务器端点击处理程序,您需要使用.addCallbackElement(). 如果这样做,您添加的命名元素的当前值将包含在传递给您的处理程序的事件中。

既然你看到了undefined,很可能你没有添加回调。您的 UI 定义中应该有这样的内容:

var handler = app.createServerHandler('handleButton1')
                 .addCallbackElement(textBox1)
                 .addCallbackElement(textBox2);
button.addClickHandler(handler);

元素的名称将用于标记回调值 ( .setName()),而 id 将用于访问处理程序中的元素 ( .setId())。

这是您的脚本的工作版本:

function doGet() {
  var app = UiApp.createApplication();

  var textBox1 = app.createTextBox().setName("TextBox1").setId("TextBox1");
  var textBox2 = app.createTextBox().setName("TextBox2").setId("TextBox2");
  var button = app.createButton('Swap Contents');
  app.add(textBox1).add(textBox2).add(button);

  var handler = app.createServerHandler('handleButton1')
                   .addCallbackElement(textBox1)
                   .addCallbackElement(textBox2);
  button.addClickHandler(handler);

  return app;
}

function handleButton1(e) 
{
  //Logger.log(JSON.stringify(e));
  var app = UiApp.getActiveApplication();
  var v1 = e.parameter.TextBox1;
  var v2 = e.parameter.TextBox2;
  app.getElementById("TextBox1").setText(v2);
  app.getElementById("TextBox2").setText(v1);
  return app;
}
于 2013-07-17T14:57:41.120 回答