2012-06-11 50 views
0

我正在構建一個簡單的天氣部件。目前的天氣狀況是從國家氣象局xml文件中讀出的,然後我想解析和存儲模型中的相關數據,但$ .ajax的回調不會連接(我這樣做)。Backbone.Model回調和這個問題

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

我想你只需要移動你的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

替代方法:'.done(_。bind(function(){...},this))' – Yaroslav

+0

這就是問題所在。謝謝。 –

+2

我發現最有用的命名約定是'var _this = this;'在外部作用域中。 –

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始終有效。