Pregunta

Usando BackBone.js, tratando de hacer un simple Get () en una colección después de obtener elementos del servidor.

Fetch parece funcionar bien. Sin embargo, cuando trato de obtener un elemento por identificación de la colección, obtengo el resultado inesperado de indefinido, en lugar de un modelo.

Aquí está el código de los elementos de la columna vertebral:

  Model.Scenario = Backbone.Model.extend({

    defaults: function() {
      return {
        title: 'Scenario',
        answer: null,
      };
    }

  });

  Collection.Scenarios = Backbone.Collection.extend({

    model: Model.Scenario,

    url: "data.php",


  });

Entonces la creación/búsqueda de obj con un método de enrutador:

 var Router = new (Backbone.Router.extend({

    routes: {
      ":id"    : "page",
      "" : "page"
    },

    initialize: function() {
      _.bindAll(this, 'page');
      this.scenarios = new Collection.Scenarios();
      this.scenarios.fetch();
      console.log(this.scenarios);
      console.log(this.scenarios.get(1));
      console.log(this.scenarios.get(2));

      Backbone.history.start();
    },

  }))();

Finalmente, esto es lo que está registrado para el depurador (para que pueda ver que la colección está siendo poblada):

child
  _byCid: Object
  _byId: Object
    1: child
    2: child
    3: child
    4: child
    7: child
    10: child
    11: child
    12: child
    13: child
    14: child
    15: child
    16: child
    17: child
    18: child
    19: child
    20: child
    21: child
    22: child
    23: child
    26: child
    27: child
    28: child
  __proto__: Object
  length: 22
  models: Array[22]
  __proto__: ctor

 undefined  //first call to get(id)
 undefined  //2nd call to get(id)

Estoy perplejo. Perdón por la larga publicación, pero agradecería cualquier idea de lo que me estoy perdiendo. Gracias.

¿Fue útil?

Solución

Mi primer pensamiento es que el Fetch () no ha regresado cuando esté haciendo su .get ().

Pero, si lo que publicaste es exactamente lo que está sucediendo, entonces la primera consola.log (this.scenarios) muestra que está cargado.

En cualquier caso, es posible que desee intentar poner la consola.logs en el éxito: Evento de la búsqueda, solo para asegurarse de que ese no sea el problema.

Mi segundo pensamiento es que la identificación para los modelos no se está configurando correctamente.

Backbone.Model es predeterminado que usa la propiedad "ID" como ID para un modelo, Collection.get (ID) Devuelve el modelo con la ID que pasó.

Entonces, ¿la respuesta de data.php tiene una propiedad de identificación?

Intente en su lugar:

 var Router = new (Backbone.Router.extend({

    routes: {
      ":id"    : "page",
      "" : "page"
    },

    initialize: function() {
      _.bindAll(this, 'page');
      this.scenarios = new Collection.Scenarios();
      this.scenarios.fetch({
        success: function(coll, resp) {
          console.log(coll);
          console.log(coll.first());
          console.log(coll.last());
        });
      Backbone.history.start();
    },

  }))();

Que debería devolver el primer y último modelo, y sacar el problema de identificación de la imagen.

Si eso funciona, ¿qué muestran los modelos para la propiedad ID (coll.first (). Id)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top