2012-12-04 55 views
0

我正在製作出我的第一個backbone.js應用程序,並且碰到了一堵牆。也許有人可以幫助我渡過這個障礙(我理解的差距)。我想要/需要做的是將收集數據返回到我的路由器,所以我可以將它綁定到Kendo UI Grid,但我沒有看到我的收藏中的任何搜索結果...我想我一定是錯過了一些基本的東西,但我不確定它是什麼。圍繞一個獨特的backbone.js集合環繞我的頭

這是我到目前爲止有:

ES.Router = Backbone.Router.extend({routes: { 
      '': 'search', 
      'search': 'search', 
      'results': 'results' 
     }, 
     results: function() { 
      var resultsData = new ES.Results(); 
      var boo = resultsData.fetch({ 
        data: JSON.stringify({"query":"myquery"}), 
        type: 'POST', 
        contentType: 'application/json' 
        }); 
      console.log(boo); 
     }}); 

    ES.Result = Backbone.Model.extend(); 

    ES.Results = Backbone.Collection.extend({ 
     model: ES.Result, 
     url: '/search/query' 
     }); 
+0

你爲什麼不嘗試把'success'和'error'回調等指定[這裏](HTTP:/ /backbonejs.org/#Collection-fetch)並嘗試調試並查看它執行的回調。它會給你一個想法。如果它進入'error'回調,請確保你的服務器返回正確的響應,它應該是'JSON數組模型'。 – Cyclone

+0

'boo'將會是'jqXHR',日誌'resultData'會給你收集。 – Cyclone

回答

2

這裏有幾個問題:

  1. 一個獲取應該是一個GET,而不是一個POST,因爲取不應該保存或修改任何東西
  2. 也許只是個人偏好,但我想url作爲一個函數,以避免嘗試手動修改AJAX請求選項。
  3. fetch通話將永遠是異步的,所以你需要或者在選項哈希添加success回調或監聽器添加到集合的reset事件

我會寫這樣的集合:

ES.Results = Backbone.Collection.extend({ 
    initialize: function() { 
     this.query = "test"; 
    }, 
    model: ES.Result, 
    url: function() { 
     return '/search/query?query=' + this.query; 
    } 
}); 

然後將搜索設置,當您創建集合:

var resultsData = new ES.Results(); 
resultsData.query = "soccer"; 

的D使用success和/或on("reset")事件處理結果:

resultsData.on("reset", function(collection) { 
    console.log(collection); 
}); 

console.log("Fetching...."); 
resultsData.fetch({ 
    success: function(collection, response) { 
     console.log("Got data!" + collection.length); 
    }, 
    error: function(collection, response) { 
     console.log("Error: " + response.responseText); 
    } 
}); 

+0

感謝您的幫助。這是我失蹤的一塊。至於POST與GET,我不確定我明白爲什麼不使用POST。一些POST數據(查詢字符串)可能會很長。 – Charles

+1

@Charles我想這可能不是必要的做一個Get。這只是REST模型的規範,Backbone使用(默認)Get = fetch,Post = save和Put = update。 – McGarnagle