Backbone.Model回调和THIS的问题

时间:2012-06-11 22:01:50

标签: backbone.js

我正在构建一个简单的天气小部件。从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”,我会很高兴。

提前感谢您的帮助。

2 个答案:

答案 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它始终有效。