underscore template backbonejs javascript backbone.js

javascript - template - backbonejs github



Backbone.js error: se debe especificar una propiedad o funciĆ³n ''url'' (0)

Esta es en realidad una respuesta, no una pregunta. Usando backbone.js pesadamente. Golpee a una pequeña criatura desagradable pero no encontré una explicación de mi caso particular en línea. Con suerte, esto le ahorrará a alguien más algo de tiempo.

Síntoma

Llamar a fetch () en un modelo extraído de una colección da como resultado un error en la red troncal: "Se debe especificar una propiedad o función ''url''", aunque tanto la colección como el modelo anulan la sincronización ().

Recreación

AppPax.People = Backbone.Collection.extend({ ... model: AppPax.Person, ... }); ... AppPax.Person = AppPax.Model.extend({ ... sync: function(method, model, options) { var response; switch (method) { case "read": response = AppPax.getPerson(this.get("party_id")); break; ... }, ... }); var c = new AppPax.People(); c.fetch(); var person = c.find(function(person){ return(person.get("party_id") == "5"); }); // everything seemingly successful up to here (but not really) person.fetch();

Error de red troncal resultante: "Se debe especificar una propiedad o función ''url''"

Investigación mal dirigida

Así que después de algunas depuraciones e investigaciones, incluyendo mirar el código backbone.js, estaba claro que Backbone estaba buscando la propiedad url en el modelo Person y no pudo encontrarla. Sin embargo, mi modelo Person anula sync () y cuando un modelo anula sync () Backbone no exige que el modelo proporcione una propiedad / método url.

También noté una anomalía: los modelos de la colección nunca se crearon.

Todas mis otras cosas basadas en el mismo patrón exacto habían estado funcionando bien durante mucho tiempo.

¿Qué hacer?

Causa principal

La causa raíz resultó ser que en mi definición de módulo (AppPax) había puesto la definición de Persona después de la definición de Personas (debido a mi hábito ahora no tan útil de ordenar el código alfabéticamente).

Cuando Backbone creó una instancia de People a petición mía, aparentemente no sabía nada sobre AppPax.Person, por lo que creó su propia versión de Person en función de las propiedades del modelo devueltas por c.fetch (), sin todas mis cosas buenas en ella. , incluido mi método sync ()

Así que cuando traté de hacer person.fetch () estaba usando su propia definición de Persona minimalista no mía, y esa definición no tenía el método sync (), por lo que buscó una propiedad / método url en Person, no lo encontró ... ahogado.

Así que definí AppPax.Person antes de AppPax.People y todo funcionó bien.