0

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

在此先感谢您的帮助。

4

2 回答 2

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.

于 2012-06-11T22:36:32.607 回答
1

上面的答案会起作用,但是有一个带有下划线的内置工具。尝试这个:

.done(_.bind(function( data ) { // <----- rather than the 'this' in here
    this.store( $( data ).find( 'current_observation' )[ 0 ] );
}, this));

这样,that=this当您将执行上下文设置为thiswith 时,您将永远不必执行 a _.bind

另外,我发现这_.bindAll(this, ...)并不能保证你会绑定到this. 在我需要的水平上使用_.bind它总是有效的。

于 2012-06-12T16:21:51.463 回答