backbone.js集合没有响应.each

时间:2012-01-14 21:06:14

标签: collections 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],...

3 个答案:

答案 0 :(得分:6)

在调用每个方法的回调函数时会丢失执行上下文

在传递回调时使用_.bind(this.render_match, this)以确保render_match具有正确的上下文

并且您收到错误,因为您没有为getJson方法包装回调函数。你也必须在那里使用下划线bind方法。

你应该阅读一下javascript this以及如何驯服它 - 试试这里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)
},

虽然从我所看到的 - 我假设你在这里展示的代码是模型或集合 - 处理渲染视图 - 你不应该这样做!模型和集合只用于存储和解析数据 - 所有渲染和控制应用程序流都应该在路由器的帮助下在View(控制器)中完成。

答案 1 :(得分:3)

$.getJson更改了this引用。 jquery中的许多方法都这样做,因此this.render_match的值为null。您将null传递给each并且失败。

要解决此问题,请在var _this = this;之前创建对此的引用(例如$.getJson)并使用它而不是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)
},

答案 2 :(得分:-1)

刚刚在这里采取刺刀(我对Backbone.js一无所知),但这不是你想要的:

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

祝你好运!