2013-03-04 35 views
0

我是Appcelerator Titanium APP開發的初學者。從this鏈接的靈感中,我試圖創建一個倒計時器,以便在TableRowView中工作,因爲每行都有自己的時間設置。並且我定製這個課程以顯示小時分鐘和秒鐘。在rowview中創建倒計時(鈦)

我在每個TableRowView中創建了以下代碼以便在列表中執行倒計時。

代碼1個

my_timer[timer_index] = new countDown(parseInt(timer_index), parseInt(15), parseInt(50), 
function() { 
    remainingTime.text = ''+my_timer[timer_index].time.h + " : " + my_timer[timer_index].time.m + " : " + my_timer    [timer_index].time.s; 
}, function() { 
    //alert("The time is up!"); 
    } 
); 

my_timer [timer_index ++]啓動();

my_time用於推動每一行的倒數計時器的所有實例。

數據來自XHR,因此我創建了一個數組文本來保存代碼片段中的所有實例。

問題:當我嘗試使用此代碼運行我的應用程序,它讓我看到一個異常說像「time.h是不確定的」。但是,我在代碼中看到了time.h

此外,我可以通過使用單個陣列

例如使用這個類爲多個倒計時:

my_timer[0] = new countDown(2,5,5,function(){ 
    somelabel1.text = my_timer[0].time.h+":"+my_timer[0].time.m+":"+my_timer[0].time.s; 
}) 
my_timer[1] = new countDown(2,5,5,function(){ 
    somelabel1.text = my_timer[1].time.h+":"+my_timer[1].time.m+":"+my_timer[1].time.s; 
}) 

上面的代碼完美地工作,它有任何錯誤。但是,如果我嘗試在循環中使用此類並傳遞索引號而不是像代碼1中的硬編碼值,它將顯示如上所述的異常。

任何幫助將非常可觀。

預先感謝您。

Desire screen to create with countdown timer in TableRowView

+0

你也許可以說明問題? – 2013-03-04 11:30:22

回答

0

謝謝你的時間和答案。我只是解決了倒計時定製類

var countDown = function(h, m, s, _instance_index, fn_tick, fn_end) { 
     return { 
      total_sec : h * 60 * 60 + m * 60 + s, 
      timer : this.timer, 
      instance_index : _instance_index, 
      set : function(h, m, s) { 
       this.total_sec = parseInt(heart) * 60 * 60 + parseInt(e) * 60 + parseInt(s); 
       this.time = { 
        h : h, 
        m : m, 
        s : s 
       }; 
       return this; 
      }, 
      start : function() { 
       var self = this; 
       this.timer = setInterval(function() { 
        ///alert('running'); 
        if (self.total_sec) { 
         self.total_sec--; 
         var hour = parseInt(self.total_sec/(60 * 60)); 
         var min = (self.total_sec - (parseInt(hour * (60 * 60))) - (self.total_sec % 60))/60; 

         self.time = { 
          h : parseInt(self.total_sec/(60 * 60)), 
          m : parseInt(min), 
          s : (self.total_sec % 60) 
         }; 
         fn_tick(self.time.h + ":" + self.time.m + ":" + self.time.s, self.instance_index); 
        } else { 
         self.stop(); 
         fn_end(); 
        } 
       }, 1000); 
       return this; 
      }, 
      stop : function() { 
       clearInterval(this.timer); 
       this.time = { 
        h : 0, 
        m : 0, 
        s : 0 
       }; 
       this.total_sec = 0; 
       return this; 
      } 
     }; 
    }; 

而且調用這個類使用下面的代碼這個問題:

my_timer[items_json.Record.NEW[i].ASSIGN_QUEST_ID] = new countDown(parseInt(n[0]), parseInt(n[1]), parseInt(n[2]), items_json.Record.NEW[i].ASSIGN_QUEST_ID, function(curr_time, instance_index) { 
             questTime[instance_index].text = 'TIME LEFT ' + curr_time; 

            }, function() { 
             //alert("The time is up!"); 
            }); 
            my_timer[items_json.Record.NEW[i].ASSIGN_QUEST_ID].start(); 
0

好吧,如果我猜的話,我也有猜測是因爲你沒有給我們一個完整的實例或您的問題,甚至說明...

的直覺是您正在循環創建行,並在嵌套函數中引用可變變量(remainingTime)。但是當您轉到循環中的下一個項目時,remainingTime會發生變化。因此,當嵌套函數引用它時,它與您最初指定的內容不同,因此只有最後一個計時器正在更新。

這由以下代碼演示,它將三次警告「3」。

for (var i = 0; i < 3; i++) { 
    setTimeout(function() { 
     alert(i); 
    }, 100); 
} 

如果你不知道是什麼原因,或如何解決它嗎,那麼我建議你花一些依偎着的火災與喬一杯茶,一本好書JavaScript的更多的時間。