主干-不能循环通过集合

backbone - cannot loop through a collection

本文关键字:集合 循环 不能 主干      更新时间:2023-09-26

我在一个帮助用数据填充视图的集合中循环时遇到问题。当我试图循环浏览集合并得到以下错误时,

未捕获的类型错误:对象#没有方法"each"

我完全不知道为什么会出现这个错误,除了对象显然没有那个方法之外,但是我只有在运行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();
    };

试试这个,把这个函数放在你的集合中

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

希望这能有所帮助。

我不确定drop函数与它有什么关系,但我看到renderListkeyup期间传递了searchName的结果。可能发生的情况是,searchName返回一个正则数组,而不是一个具有each方法的包装对象(即Backbone.Collection、jQuery集合或Underscore包装对象)。

不要调用collection.each,而是使用jQuery或Undercore:

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

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