2012-12-04 24 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