在集合中删除模型时,模型的Cid会发生变化

时间:2015-12-28 06:41:54

标签: jquery backbone.js

我有一个问题非常愚蠢的模型cid。 当我将一些模型添加到集合中然后我删除其中的一个,但其他模型的cid被更改。我不明白我的代码会出现问题 将模型添加到集合中:

addSchedule: function () {
        var schedule = this.model.schedules.push({touch_plan_id: this.model.get('id')});
        this.selective = 'sch_' + this.model.schedules.last().cid;
        console.log(this.model.schedules);
    },

从集合中移除模型:

removeSchedule: function () {;
        var activeDOM = $('.active');
        var cid = activeDOM.attr('id');
        if (cid) {
            var schedule = this.model.schedules.get(cid);
            if (schedule.get('id')) {
                schedule.destroy({wait: true});
            } else {
                this.model.schedules.remove(schedule);
            }
        }
    },

1 个答案:

答案 0 :(得分:0)

我可以告诉你急于得到正确答案,这样你就可以继续前进,但是有些东西你缺少更重要的东西。如果你不理解这一点,你也可以使用jQuery,因为你没有按预期使用Backbone。

如果你坚持做这个非常错误,非常糟糕,非常低效,非常不专业的事情,那么这就是我的看法 - cid的规则是它是在当时创造的。 Backbone使用underscorejs uniqueId函数创建模型。您试图将DOM id模型cid相关联,这是毫无意义的。你很困惑,除非你发布你的代码,而不是你自己调试的视频,否则没有人能帮忙!

Backbone的一个重点是处理逻辑对象而不是DOM 。您似乎试图根据类Schedule是否应用于某个内容来删除active

你的逻辑对我来说是这样的:

  1. 寻找$('.active')(顺便说一句,这可能不止一件事,你认为这不是问题吗?)
  2. 查看是否在其上定义了id属性,即它具有元素ID
  3. 如果有,请使用Schedulethis.model.schedulesget找到cid(你能做到吗?你怎么知道你赢了?)通过???)
  4. 的方式得到一个空指针异常
  5. 如果存在schedule BACKBONE id属性,请销毁该计划。如果没有,请从集合中删除计划。如果你不知道,Backbone ID有 NOTHING 来处理DOM ID。
  6. 这对你有意义吗?来吧,我知道你对此不满意。

    在你走这条路之前,停下来思考你想做什么。

    我将假设您要删除标记为Schedule的所有active

    这就是我的建议,我确信您所知道的是合理的方法:

    1. 在名为Schedule
    2. active模型上设置属性
    3. 使用Backbone Events处理对active的更改,例如,通过更改DOM更改active元素。
    4. 在不查看DOM的情况下处理删除:
    5. schedules.remove(schedules.where({active: true}));

      现在,在第2点,事件,使用起来非常简单和愉快。

      ...
      var ScheduleView = Backbone.View.extend({
          render: function() { 
              ...
              this.$el.html(blah);
              var _this = this;
              this.listenTo(this.model, 'change:active', function(schedule, activeOrNot) {
                   if (activeOrNot === true) { _this.$el.addClass('active'); }
                   else { _this.$el.removeClass('active'); }
              }
          }
      });