2013-08-12 3 views
0

У меня есть следующие три функции в представлении Backbone. Первоначально звонок updateTimer в пределах Playback и StartRecording функции вызвали ошибку, которая ушла после того, как я предшествовал вызову this, как в this.updateTimer. Тем не менее, я ставлю демо-приложение на сервере (где код компилируется в один файл) и вызов this.updateTimer является вызывая ошибкуобласть действия `this` меняется на производственном сервере?

Uncaught TypeError: Object #<Object> has no method 'updateTimer' (repeated 28 times) 

Можете ли вы объяснить, почему это может быть?

Три функции работают на моей локальной машине:

 PlayBack: function(e){ 
     e.preventDefault(); 
     this.updateTimer(0); 
     SC.recordPlay({ 
      progress: function(ms) { 
       this.updateTimer(ms); 
      } 
     }); 

     }, 

     updateTimer: function(ms){ 
     $('.status').text(SC.Helper.millisecondsToHMS(ms)); 


     }, 

     StartRecording: function(e){ 

     $('#startRecording').hide(); 
      $('#stopRecording').show(); 
      e.preventDefault(); 
      SC.record({ 
      progress: function(ms, avgPeak) { 
       this.updateTimer(ms); 
      } 
      }); 

     }, 

С консоли сервера производства

,PlayBack: function(t) { 
     t.preventDefault(), this.updateTimer(0), SC.recordPlay({progress: function(t) { 
       this.updateTimer(t) 
      }}) 
    },updateTimer: function(t) { 
     $(".status").text(SC.Helper.millisecondsToHMS(t)) 
    },StartRecording: function(t) { 
     $("#startRecording").hide(), $("#stopRecording").show(), t.preventDefault(), SC.record({progress: function(t) { 
       this.updateTimer(t) 
Uncaught TypeError: Object #<Object> has no method 'updateTimer' (repeated 28 times) 
      }}) 

ответ

3

Вы получаете ошибку, потому что this контекст теряется во внутренней функции вы переходят на SC.record и больше не ссылаются на ваш вид базовой линии. Там несколько способов обойти это, один из которых является воспользоваться закрытий и создать ссылку на правильную this и использовать его в progress обратного вызова:

StartRecording: function(e){ 
    var self = this; 
    $('#startRecording').hide(); 
     $('#stopRecording').show(); 
     e.preventDefault(); 
     SC.record({ 
     progress: function(ms, avgPeak) { 
      self.updateTimer(ms); 
     } 
     }); 

    }, 

То же самое идет для вызова updateTimer в вызове до SC.recordPlay в Playback.

+0

спасибо, я должен был это знать, но почему ошибка не срабатывает на моей локальной машине? – Leahcim

+0

@ Leahcim: Этот код действительно не должен работать на локальной машине. Возможно, ошибка осталась незамеченной или что код почему-то не был вызван? –

Смежные вопросы