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(); 

データは正しく読み取られますが、ストア関数を呼び出すコールバックの完了関数を取得できません。(「done」が解析されてから「this.set」が実行されれば幸いです。

よろしくお願いします。

4

2 に答える 2

4

var that = this;1レベル上に移動するだけでよいと思います:

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が呼び出されるまでには、コールバックが既に間違った を持っているため、遅すぎます。updatedonedonethis

于 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 に答える