2012-01-14 82 views
4

我有什么应该是非常简单的。我创建了一个新的集合,并且我想将它传递给一个渲染器并将集合模型添加到页面中。backbone.js集合没有响应。每个

 
get_results: function(){ 
    $.getJson(this.url,function(response){ 
     this.search_results = new Kitchon.Collections.searchList(response); 
     console.log(this.search_results); 
     this.search_results.each(this.render_match); 
    } 
}, 
render_match: function(model){ 
    console.log(model) 
}, 

这将返回一个错误

Uncaught TypeError: undefined is not a function

我的收藏有一个普通的结构

 
_byCid: Object 
_byId: Object 
_onModelEvent: function() { [native code] } 
_removeReference: function() { [native code] } 
length: 7 
models: Array[7] 
__proto__: o 

我已经试过许多事情,但有一点是伸出了也许我不得不通过 this.search_results.models.each(this.render_match);因为这是实际的阵列,但如果我这样做,我得到一个Uncaught typeError: Object [object Object],[object Object],...

回答

6

你失去的时候每个方法调用回调函数的执行上下文传递回调,以确保render_match具有正确的上下文

和你得到错误,因为你没有换

使用_.bind(this.render_match, this)getJson方法的回调函数既不。您也必须在那里使用下划线bind方法。从我SEEE在这里尝试http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

正确的代码看起来应该或多或少是这样的...

get_results: function(){ 

    $.getJSON(this.url, _.bind(function(response){ 

     this.search_results = new Kitchon.Collections.searchList(response); 
     console.log(this.search_results); 
     this.search_results.each(_.bind(this.render_match, this)); 
    }, this)); 
}, 
render_match: function(model){ 

    console.log(model) 
}, 

虽然 -

你应该阅读一些关于JavaScript的this以及如何驯服它 - 我假设你在这里展示的代码是模型或集合 - 处理渲染视图 - 你不应该这样做!模型和集合仅用于存储和解析数据 - 所有渲染和控制应用程序流程都应在路由器的帮助下在View(控制器)中完成。

+1

谢谢汤姆,我知道这会以某种方式迷失在'这个',但我不知道如何得到这个工作。来自耶胡达的文章是一个很好的补充。搜索“this”并取回相关结果很困难。 – pedalpete 2012-01-15 13:04:56

-1

只是走一个刺在这里(我不知道什么Backbone.js的),但是这不就是你在找什么:

$.each(this.search_results, function(index, value) { 
    alert(index + ': ' + value); 
}); 

祝您好运!

+1

Backbone.js的被映射了很多underscore.js方法的集合 - 你不需要和不应该使用每次当你手头underscorejs的jQuery - 它的实现速度会更快+ this.search_results不是真正的数组,而是Backbone.Collection实例 - 如果您想直接遍历模型,则需要访问集合上的'models'属性。 – 2012-01-14 21:27:53

3

$.getJson更改this参考。 jquery中的许多方法都这样做,所以this.render_match的值为null。您将null传递给each并且失败。

要解决该问题,请在$.getJson之前创建对此的引用(如var _this = this;),然后使用它来代替this。代码应该是象下面这样:

get_results: function(){ 
    var _this = this; 
    $.getJson(this.url,function(response){ 
     _this.search_results = new Kitchon.Collections.searchList(response); 
     console.log(_this.search_results); 
     _this.search_results.each(_this.render_match); 
    } 
}, 
render_match: function(model){ 
    console.log(model) 
}, 
+1

你在每个循环中再次失去了'this'上下文 - 检查我的答案 – 2012-01-14 21:35:59