我一直在玩這個小測試代碼 - 我承認 - 是不是很有用,但我注意到,價值第一的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;
}
該應用程序是這樣的:
編輯:工作液中添加小部件到面板(請參閱後菲爾的火處理程序答案) 這樣的:
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
謝謝,我只是沒想到的是,處理器可稱爲中的doGet功能的「迴歸」 ... – 2013-02-10 08:39:43
那之前說,問題可能來自因處理被立即解僱......「正常「setup(當用戶發起事件時)我可以在處理程序定義之後添加元素,而不會有任何問題。這就是讓我感到困惑的原因,因爲我之前從未嘗試過這個特殊屬性......再次感謝大家;-) – 2013-02-10 09:45:40
實際上,它看起來像doGet完成之前從來沒有調用處理程序。 [我在這裏寫了一個測試](http://pastebin.com/PuLXZML8)。我永遠不能讓處理程序在主線程之前執行。這導致我相信,當你setValue(true,true)時,處理程序*排隊*但不被執行。 [此示例](http://pastebin.com/QxF6xmUe)證明處理程序已排隊(所有參數都已收集),但未執行。我會在我的回答中添加一個這樣的提示。 – 2013-02-10 17:16:12