2013-01-08 22 views
0

我是新來Backbone.js的,我下面的教程試圖使其適應我的需要。
我打電話從主應用視圖,以便檢索多個對象獲取方法集合中插入。 我可以看到鉻在返回json數據,提取函數返回成功,但收集不填充。Backbone.js的集合都抓取,不能檢索項目

我使用IcanHaz進行渲染。它只打印出我在Job模型中定義的默認模型。

var Job = Backbone.Model.extend({ 
    defaults: { 
     title: 'Not specified', 
     status: 0, 
     created_at: 'Not specified' 
    } 
}); 


var JobView = Backbone.View.extend({ 
    render: function() { 
     // template with ICanHaz.js (ich) 
     this.el = ich.jobRowTpl(this.model.toJSON()); 
     return this; 
    } 
}); 

// define the collection of jobs 
var JobCollection = Backbone.Collection.extend({ 
    model: Job, 
    url: '/api/1.0/jobs/' 
}); 


// main app, the collection view 
var AppView = Backbone.View.extend({ 
    tagName: 'tbody', 

    initialize: function() { 
     this.jobs = new JobCollection(); 
     this.jobs.on('all', this.render, this); 
     this.jobs.fetch({ 
          error: function() { 
          console.log("error!!"); 
          }, 
          success: function() { 
           console.log("no error"); 
          } 
         }).complete(function() { 
          console.log('done'); 
          console.log('length1:' + this.jobs.length); 
         }); 
     console.log('length2: '+ this.jobs.length); 
    }, 

    render: function() { 
     this.jobs.each(function (job) { 
      var tmpjob = new JobView({model: job}).render().el; 
      $(this.el).append(tmpjob); 
      console.log('job': + this.tmpjob); 
     }, this); 

     return this; 
    } 


}); 

var app = new AppView(); 
$('#app').append(app.render().el); 

在Chrome控制檯我得到這個:

length2:0 
job:undefined 
no error 
done 
Uncaught TypeError: Cannot read property 'length' of undefined //referring to the lenght1 logging 

這些都是我取,從網下/ XHR /響應鉻檢查數據:

{"count": 2, "next": null, "previous": null, "results": [{"id": 1, "title": "testAlbum", "status": 0, "created_at": "2012-12-31"}, {"id": 2, "title": "testAlbum2", "status": 0, "created_at": "2012-12-31"}]} 


我不明白爲什麼CA後的「工作」集合存在使用提取方法,但在調用「成功」幫助器時,它在取塊中未定義。

爲什麼收集不被填充,儘管它返回成功,JSON數據從服務器返回?

我完全迷失了方向。

回答

4

添加parse方法到您的收藏剛剛返回results陣列。集合需要是一組模型,而不是整個JSON響應。

Backbone docs解釋如何使用parse

+0

謝謝你,成功了! 任何暗示爲什麼我收集的對象仍然具有長度等於零,爲什麼當我嘗試的獲取方法內成功處理函數訪問它是未定義的? 這仍然是我的控制檯的結果: '長度2:0 工作:未定義 工作:未定義 沒有錯誤 做 遺漏的類型錯誤:無法讀取的undefined' – Leonardo

+1

財產「長度」也許有兩件事情。其中一個'complete'回調中的'this'不會被視爲引用。你可以在var中保存對this的引用。 我需要檢查,但我還不能肯定的集合將被更新相當當抓取完成。聽收集上的「變化」事件可能會更好。 – ericponto

+0

你正對'this'關鍵字。只需將'var this = this;'賦值給傳入完整函數的函數就足夠了,如下所示:'console.log('length1:'+ that.jobs.length);'。另外,長度2日誌記錄等於0,因爲所有的JS代碼將按順序執行,但獲取調用是異步的,所以當我嘗試'的console.log(「長度2:」 + this.jobs.length);'集合是仍然爲空,因爲抓取功能尚未完成。這很有道理,謝謝! – Leonardo

相關問題