我一直在玩这个小测试代码 - 我承认 - 不是很有用但是我注意到第一个处理程序的callBackElement
中返回的值在第一个处理程序被调用时是未定义的时间。
我无法弄清楚为什么......所以我添加了解决问题的条件,但我仍然想知道为什么这样做会......
该脚本来自this post earlier today中显示的一个想法,我评论了导致下面脚本中的错误的行(它有点长,对不起)并作为一种计时器/计数器运行来说明能够使用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
答案 0 :(得分:0)
您为该处理程序(Panel
)指定的回调元素在调用它时没有元素。所以你基本上是将一个空面板传递给那个处理程序。因此,由于chk1
尚未添加到面板中,因此其值不会作为参数添加到处理程序中。
在{/ 1}}调用后放置chk1.setValue(true,true)
。
如this example所示,当调用Panel.add(chk1)
时,处理程序排队。这意味着将收集将传递给处理程序的所有参数。它查看回调元素,读取它们的值,然后继续执行setValue(true,true)
。 doGet
完成后,执行处理程序。