我在Backbone View中有以下三个功能。最初,在updateTimer
和Playback
功能中对StartRecording
的调用触发了一个错误,该错误在我使用this
的通话之后就消失了,就像在this.updateTimer
中一样。但是,我现在在生产服务器上放置一个演示应用程序(代码编译成一个文件),并且调用this.updateTimer会触发错误
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)
}})
答案 0 :(得分:3)
您收到错误是因为this
上下文在您传递给SC.record
的内部函数中丢失,并且不再引用您的Backbone视图。有几种解决方法,其中一种方法是利用闭包并创建对正确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
的调用也是如此。