2013-06-25 51 views
0

我无法循环访问有助于用数据填充视图的集合。当我通过收集尽量循环,得到下面的错误,主干 - 无法循环访问集合

Uncaught TypeError: Object # has no method 'each'

我absolutley不知道为什么我收到此错误,不是对象等obviosly没有该方法,但是我只得到这个运行drop函数时出错,请参阅下面的代码。

下面是骨干代码,

GroupListView.prototype.keyup = function() { 
     this.filtered = this.collection.searchName(this.$el.find("#search-query").val()); 
     return this.renderList(this.filtered); 
}; 

GroupListView.prototype.renderList = function(collection) { 
    var $collection, $this; 
    console.log(this.$el); 
    console.log(collection); 
    if (!collection) { 
    collection = this.collection; 
    console.log(collection); 
    } 
    this.$el.find(".list-items").empty(); 
    $this = this.$el.find("#people-groups-list"); 
    $collection = collection; 
    if ($collection.length < 1) { 
    this.$el.find("#people-groups-list").hide(); 
    return this.$el.find("#people-groups-list").after('<div class="activity-no-show">\ 
    <p>To add a new group, click the + in the top right hand corner to get started.</p>\ 
</div>'); 
    } else { 
    this.$el.find("#people-groups-list").show(); 

    collection.each(function(item) { 
     //console.log(item); 
     var displayView; 
     displayView = new app.GroupListDisplayView({ 
     model: item, 
     collection: $collection 
     }); 
     return $this.append(displayView.render()); 
    }); 
    return this; 
    } 
}; 

GroupListDisplayView.prototype.render = function() { 
     var $body; 
     //console.log(this.model.toJSON()); 
     this.$el.html(this.template({ 
     m: this.model.toJSON() 
     })); 
     $body = this.$el.find(".card-body"); 
     $.each(this.model.get("people"), function(i, person) { 
     var personTile; 
     this.person = new app.Person({ 
      id: person.id, 
      avatar: person.avatar, 
      first_name: person.first_name, 
      last_name: person.last_name 
     }); 
     console.log(this.person); 
     personTile = new app.PersonTileView({ 
      model: this.person 
     }); 
     return $body.html(personTile.render()); 
     }); 
     return this.$el.attr("id", "group-card-" + this.model.id); 
    }; 

GroupListDisplayView.prototype.drop = function(e) { 
     var $collection, $model, person_id, request; 
     e.preventDefault(); 
     $collection = this.collection; 
     person_id = e.originalEvent.dataTransfer.getData('Text'); 
     request = new app.PersonGroupAdd; 
     $model = this.model; 
     return request.save({ 
     async: true, 
     wait: true, 
     person_id: person_id, 
     group_id: this.model.get("id") 
     }, { 
     success: function(d) { 
      return $model.fetch({ 
      async: true, 
      wait: true 
      }); 
     } 
     }); 
    }; 

GroupListView.prototype.initialize = function() { 
     this.collection.on("change", this.renderList, this); 
     this.collection.on("reset", this.render, this); 
     return this.renderList(); 
    }; 

回答

0

试试这个,把这个功能您的收藏

parse: function (data) { 

      data.forEach(function (item) { 

       displayView = new app.GroupListDisplayView({ 
        model: item, 
        collection: $collection 
       }); 
      }); 
     } 

希望这有助于。

0

我不确定drop函数与它有什么关系,但我看到renderListkeyup期间通过了searchName的结果。可能发生的事情是searchName返回的是常规数组,而不是包含each方法(即Backbone.Collection,jQuery集合或Underscore包装对象)的包装对象。

与其说collection.each的,使用jQuery或下划线:

$.each(collection, function(i, item) { ... }); 

_.each(collection, function(item, i, list) { ... }); 
+0

这样做,我得到以下, 遗漏的类型错误:无法调用未定义 '上' 的方法其中引用此, this.collection.on(“change”,this.renderList,this); this.collection.on(“reset”,this.render,this); – Udders

+0

我没有在您发布的代码中看到那些'on'调用,但是您可能需要使用'_.bind'或'$ .proxy'设置'each'回调的上下文吗? – freejosh

+0

将原来的帖子中的电话添加到代码中 – Udders