2013-07-09 64 views
1

我使用fetch來從backbone.js加載json模型,但成功不會命中。backbone.js fetch json成功不會命中

var DialogModel = Backbone.Model.extend({ 
    url : function() { 
     return '/messages/getDialog'; 
    }, 
    parse : function(res) { 
     return res.dialog; 
    } 
}); 

var DialogView = Backbone.View.extend({ 
    el: $("#page"), 
    initialize: function() { 
     var onDataHandler = function() { 
      this.render(); 
     }; 
     this.model = new DialogModel(); 
     this.model.fetch({ success : onDataHandler}); 
     }, 
    render: function(){ 
     var data = { 
       dialogModel : this.model 
       }; 
     var form = new Backbone.Form({ 
      model: data 
     }); 
     $(this.el).html(form.render().el); 
    } 
}); 

現在發生了什麼: DialogView初始化被調用。 this.model.fetch被調用,但如果成功,onDataHandler函數將不會被擊中。 /messages/getDialog會拋出一個json文件。 正如我在網絡瀏覽器中看到的那樣,json文件加載得很好。

感謝您的幫助! Oleg

回答

1

你遇到的問題是由於一個典型的JS gotcha而與骨幹本身無關。嘗試

var that = this; 
this.model.fetch({ 
    success : function() { 
     that.render(); 
    } 
}); 

您目前通過onDataHandler是有問題的方式,因爲它會導致this引用全局對象,而不是DialogView,當函數被調用。

這個fiddle演示有問題的版本與一個有效的版本。

(您可能還需要看看JS strict mode可以從這種類型的錯誤,保護你。)

0

更妙的是監聽的事件:

this.model.on("sync", this.render).fetch(); 

我跑過這個問題同時尋找其他的東西,但目前接受的答案驅使我瘋了。沒有充分的理由在你的代碼中分別噴灑thisthat。主幹(下劃線)包含您可以綁定到的上下文參數。

that = this是沒有意義的。如果你必須實現過時的2007年時代Crockford模式,然後說var self = this。說that = this就像是說left = right。每個人都停下