我创建了一个带有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。 按下按钮时,显示的文本框值均未定义。 我哪里错了。
答案 0 :(得分: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;
}