我正在构建一个简单的天气小部件。从National Weather Service xml文件中读取当前天气状况,然后我想解析并将相关数据存储在模型中,但$ .ajax的回调将无法连接(我正在这样做)。
var Weather = Backbone.Model.extend({
initialize: function(){
_.bindAll( this, 'update', 'startLoop', 'stopLoop' );
this.startLoop();
},
startLoop: function(){
this.update();
this.interval = window.setInterval( _.bind( this.update, this ), 1000 * 60 * 60 );
},
stopLoop: function(){
this.interval = window.clearInterval( this.interval );
},
store: function( data ){
this.set({
icon : $( data ).find( 'icon_url_name' ).text()
});
},
update: function(){
$.ajax({
type: 'GET',
url: 'xml/KROC.xml',
datatype: 'xml'
})
.done( function( data ) {
var that = this;
that.store( $( data ).find( 'current_observation' )[ 0 ] );
});
}
});
var weather = new Weather();
正确读取数据,但我无法获得回调的完成功能来调用存储功能。 (如果“完成”只是解析然后执行“this.set”,我会很高兴。
提前感谢您的帮助。
答案 0 :(得分:4)
我认为您只需将var that = this;
提升一级:
update: function(){
var that = this; // <-------------- You want this 'this'
$.ajax({
type: 'GET',
url: 'xml/KROC.xml',
datatype: 'xml'
})
.done( function( data ) { // <----- rather than the 'this' in here
that.store( $( data ).find( 'current_observation' )[ 0 ] );
});
}
您希望在this
方法中捕获update
的当前值,当您调用done
时,done
回调将为时已晚已经有错this
。
答案 1 :(得分:1)
上面的答案是有效的,但是有一个带有下划线的内置设施。试试这个:
.done(_.bind(function( data ) { // <----- rather than the 'this' in here
this.store( $( data ).find( 'current_observation' )[ 0 ] );
}, this));
这样,您可以永远不必执行that=this
,因为您使用_.bind
将执行上下文设置为this
。
此外,我发现_.bindAll(this, ...)
并不保证您会绑定到this
。在我需要的级别使用_.bind
它始终有效。