1

当我想使用预先填充的 ID 向服务器添加新模型时,我遇到了 idAttribute 问题,导致 .save() 报告错误的 isNew() 值。这导致我将其关闭并设置 model.id手动。

这是我的观点:

    RecordListItemView = Backbone.View.extend({
        initialize:function () {
            var record = this.model.attributes;
            if (record.user_id) {
                this.model.id = parseInt( record.user_id );
                record.id = parseInt( record.user_id );
                    // Added this so ID would show up in model and .attributes
            }
            this.model.bind("change", this.render, this);
            this.model.bind("destroy", this.close, this);
        },

        render:function (eventName) {
            $(this.el).html(this.template(this.model));
            console.log(this);
            return this;
        }
    });

在这一点上,我无法使用 collection.get(id) 检索任何记录,尽管我可以通过 collection.getByCid(cid) 来做到这一点。

这是我的 console.log 输出:

    d
      $el: e.fn.e.init[1]
      cid: "view36"
      el: HTMLLIElement
      model: d
        _callbacks: Object
        _escapedAttributes: Object
        _pending: Object
        _previousAttributes: Object
        _silent: Object
        attributes: Object
        id: 15
        user_id: "15"
        user_name: "Test"
        __proto__: Object
      changed: Object
      cid: "c8"
      collection: d
      id: 15
      __proto__: x
    options: Object
    __proto__: x

有没有办法修复 collection.get(id) 而无需更改我的数据库以包含 id 字段?(目前使用user_id作为pk)

正如本杰明·考克斯 (Benjamin Cox) 在下面发布的那样:(将 parseInt() 删除为不必要的)

代替

    this.model.id = record.user_id;

    this.model.set({ id: record.user_id });

.. 避免绕过模型的更改事件,从而更新集合的 internal_byId[] 数组。

在测试了两者之后,我最终使用了 mu is too short 的parse建议..

    parse: function(response) {
        return {
            id: response.user_id,
            user_id: response.user_id,
            user_name: response.user_name
        };
    }
4

1 回答 1

2

调用 collection.get(id) 找不到您的模型的原因是您在这样做时绕过了 Backbone 的事件机制:

this.model.id = parseInt( record.user_id );

如果您改为这样做:

this.model.set({ id: parseInt(record.user_id)});

那么模型的 set() 方法中的 Backbone 事件代码将触发“change:id”事件。反过来,该集合侦听此事件并更新它的内部 _byId[] 数组变量。稍后,当您调用 collection.get(id) 时,此数组用于搜索匹配模型。

于 2012-05-03T20:41:49.430 回答