1

IDが事前に入力された新しいモデルをサーバーに追加したいときに、.save()が不正なisNew()値を報告する原因となる、idAttributeの問題が発生していました。そのため、モデルをオフにして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

idフィールドを含めるようにデータベースを変更せずにcollection.get(id)を修正する方法はありますか?(現在、pkとしてuser_idを使用しています)

ベンジャミンコックスによって以下に投稿されたように:(不要なものとしてparseInt()が削除されました)

交換

    this.model.id = record.user_id;

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

..モデルのchangeイベントをバイパスして、コレクションのinternal_byId[]配列を更新しないようにするため。

両方をテストした後、muを使用して終了しました。短すぎる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 に答える