backbone.js collection.get(id) devolviendo indefinido

Estaba teniendo problemas con idAttribute que causaban que .save() informara un valor incorrecto de isNew() cuando quería agregar un nuevo modelo al servidor con el ID rellenado previamente... lo que me llevó a mantenerlo apagado y establecer el model.id a mano.

Aquí está mi vista:

    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;
        }
    });

En este punto, no puedo recuperar ningún registro usando collection.get(id), aunque puedo hacerlo a través de collection.getByCid(cid) sin problemas.

Aquí está mi salida de 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

¿Hay alguna manera de arreglar collection.get(id) sin tener que modificar mi base de datos para incluir un campo de identificación? (Actualmente usando user_id como el pk)

Como se publica a continuación por Benjamin Cox: (con parseInt() eliminado como innecesario)

Replace

    this.model.id = record.user_id;

con

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

.. para evitar pasar por alto el evento de cambio del modelo que, a su vez, actualiza la matriz internal_byId[] de la colección.

Después de probar ambos, terminé usando mu is too short's parse sugerencia..

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

preguntado el 03 de mayo de 12 a las 21:05

1 Respuestas

La razón por la que llamar a collection.get(id) no encuentra su modelo es que está pasando por alto el mecanismo de eventos de Backbone cuando lo hace:

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

Si haces esto en su lugar:

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

luego, el código del evento Backbone en el método set() del modelo activará un evento "cambio: id". La colección, a su vez, escucha este evento y actualiza su variable de matriz interna _byId[]. Más tarde, cuando llama a collection.get(id), esta matriz se usa para buscar el modelo coincidente.

contestado el 03 de mayo de 12 a las 21:05

Añadiendo un parse implementación para copiar user_id a id cuando obtener desde el servidor también podría ser una buena idea. - mu es demasiado corto

Benjamin: eso tiene mucho sentido, lo probaré tan pronto como llegue a la oficina mañana. Mu - Tendré que investigar parse para eso, pero me sentiría mucho mejor usando métodos de backbone en lugar de piratear los datos en su lugar. Gracias a los dos. - Rosseyn

Gracias a ambos por sus sugerencias, ¡limpiaron las cosas muy bien! - Rosseyn

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.