2013-02-09 66 views
0

我一直在玩這個小測試代碼 - 我承認 - 是不是很有用,但我注意到,價值第一的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; 
    } 

該應用程序是這樣的:

enter image description here

,是testable here

編輯:工作液中添加小部件到面板(請參閱後菲爾的火處理程序答案) 這樣的:

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

您用於該處理程序(Panel)指定的回調元件具有在該被調用的時間沒有元素。所以你本質上是將一個空的面板傳遞給那個處理程序。因此,由於chk1尚未添加到面板,因此其值不會作爲處理程序的參數添加。

chk1.setValue(true,true)呼叫Panel.add(chk1)

如在this example中看到的,處理器是排隊的當調用setValue(true,true)時。這意味着將傳遞給處理程序的所有參數都會收集起來。它查看回調元素,讀取它們的值,然後繼續執行doGet。在doGet完成後,處理程序被執行。

+0

謝謝,我只是沒想到的是,處理器可稱爲中的doGet功能的「迴歸」 ... – 2013-02-10 08:39:43

+0

那之前說,問題可能來自因處理被立即解僱......「正常「setup(當用戶發起事件時)我可以在處理程序定義之後添加元素,而不會有任何問題。這就是讓我感到困惑的原因,因爲我之前從未嘗試過這個特殊屬性......再次感謝大家;-) – 2013-02-10 09:45:40

+0

實際上,它看起來像doGet完成之前從來沒有調用處理程序。 [我在這裏寫了一個測試](http://pastebin.com/PuLXZML8)。我永遠不能讓處理程序在主線程之前執行。這導致我相信,當你setValue(true,true)時,處理程序*排隊*但不被執行。 [此示例](http://pastebin.com/QxF6xmUe)證明處理程序已排隊(所有參數都已收集),但未執行。我會在我的回答中添加一個這樣的提示。 – 2013-02-10 17:16:12

相關問題