2011-04-27 12 views
15

Recientemente he comenzado a usar Backbone.js. Me gusta la arquitectura, en términos de características es casi exactamente lo que necesito ...Backbone.js y su confusión API

... Sin embargo me encontré con las siguientes salvedades:

  • Para Collection s get significa algo diferente que para Model s. No hay set. Se debe acceder a los atributos de forma regular. Lo encuentro bastante inconsistente. Es fácil confundir modelos y colecciones a veces. ¿Hay algo que se pueda hacer para superar esto?
  • La asignación de valores iniciales dentro de Model.extend no siempre funciona. Por ejemplo, asignando urlno anula el comportamiento predeterminado. Esto solo se puede lograr mediante una llamada al método set(). De nuevo, muy propenso a errores.
  • Todavía no sé si es necesario usar get/set dentro de la llamada initialize().
  • No entiendo por qué no puedo simplemente llamar al _.bindAll(this) dentro de initialize() y tengo que enumerar nombres de funciones específicas para que se vinculen así: _.bindAll(this, firstFunc, secondFunc, ...). Esto no es muy seco

Me gustaría saber: ¿cuáles son las mejores prácticas con respecto a las situaciones mencionadas? ¿Qué haces para que el marco sea más consistente? ¿Algún parche de mono? ¿Estoy haciendo algo mal/en contra de la convención?

Agradecería cualquier buen ejemplo del mundo real. Encontré esto: http://documentcloud.github.com/backbone/docs/todos.html y http://liquidmedia.ca/blog/2011/01/backbone-js-part-1/ y esos no resuelven ninguno de los problemas mencionados. De hecho, solo presentan las ideas más simples y absolutamente ningún caso de frontera, por lo que cualquier cosa más complicada podría ser útil.

EDIT:

Ok, y hay uno más fundamental creas que no entiendo:

  • ¿Estoy siempre permite colocar atributos adicionales en la extensión de esta manera: var SomeModel = Backbone.Model.extend({ myattribute: myvalue })?
    • Si es así, ¿por qué no funcionan las siguientes llamadas al new SomeModel().get("myattribute")?
  • ¿Qué es exactamente this dentro de initialize()? ¿Es clase de modelo o instancia modelo?

EDITAR (2):

Bueno, he encontrado esto: http://maccman.github.com/spine/. Parece que Backbone.js 2.0 también comparte un nombre similar :). Todavía no lo he probado, lo que podría ser un poco de un bloqueo de la demostración, ya que la biblioteca es muy reciente. Sin embargo, desde el lado de los documentos parece muy prometedor. Se deshace de la mayoría de los problemas que encontré, simplifica la API, incluso se deshace de la dependencia en underscore.js que para una biblioteca es algo bueno. Publicaré mis hallazgos adicionales aquí.

+0

Buena pregunta, yo también encontré Backbone un poco extraño. Debe agregar sus hallazgos como respuesta a su propia pregunta. – brianpeiris

+0

@brianpeiris Lo haré tan pronto como establezca que efectivamente se puede usar. Hasta aquí todo bien. La columna vertebral realmente parece estar bien pensada. – julkiewicz

Respuesta

10

Ok, creo que puedo decirlo con bastante confianza ahora: Backbone está muerto, viva Spine.

Spine no es exactamente un tenedor de Backbone. Sin embargo, es muy similar y está claramente inspirado por algunas de las decisiones de diseño. Se podría decir que el autor trató de retener tanto como fue posible la API de la red troncal original, deshaciéndose de todo lo innecesario o ilógico. Me resulta también más fácil de extender. La lista de cambios incluye, entre otras cosas:

  • Deshacerse de la temida Collection s. se utilizan "métodos de clase" en su lugar,
  • Obtener el máximo provecho de la naturaleza prototípica js (es decir, no se necesita get/set). A los atributos se accede directamente. Se requiere una llamada explícita a save() para activar un evento.
  • Views y Controllers ahora se fusionaron en un nuevo tipo de Controllers juntos cuyo propósito es responder a los eventos DOM y vincular a los eventos del modelo.
  • El nombre :)

puedo encontrar esas decisiones de diseño coherente y sensata.

+0

Me estoy inclinando más hacia la columna vertebral también. He estado usando Backbone y la cosa get ('propiedad') es un problema no solo en el código, sino también en las plantillas. Esa es mi única carne de verdad con BackBone. Ojalá Spine tuviera una clase View. Si observa el patrón de diseño del elemento, es exactamente lo que View w/Collection está en Backbone. – mgutz

+0

@mgutz Bueno, podría ser un patrón de diseño, sin embargo, siempre he encontrado colecciones redundantes. Y es especialmente doloroso ya que son prácticamente necesarios (la forma en que las URL se crean de manera predeterminada). También puede tener colecciones en columna vertebral y menos escritura que no tener colecciones en columna vertebral. – julkiewicz

+0

@julkiewicz backbone está muerto? su respuesta tiene más de un año ... ¿sigue siendo precisa? –

0

La razón por la que no hay un "conjunto" para Colecciones es porque las Colecciones no son matrices, sino conjuntos, que se pueden ordenar potencialmente. La única forma admitida de colocar un elemento en una posición particular es agregarlo a la colección y luego ordenar la colección.

+0

Eso no es lo que quise decir. Para 'Modelos'' get() 'significa devolver un valor de un atributo. Las colecciones pueden tener, y tienen, atributos también, como decir '.url'. Sin embargo, 'get()' está reservado para acceder a los elementos. Personalmente, no nombraría idénticamente dos funciones totalmente diferentes: ese es mi punto. – julkiewicz

+0

Lo entendí. Pero también dijiste "no hay conjunto". –

+0

Nuevamente, 'set()' para 'Model's significa establecer un atributo. Sin embargo, para una colección se supone que debo establecer atributos directamente. Esto es aún más confuso, ya que es posible hacer lo mismo por error a un modelo y por lo tanto no disparar los factores desencadenantes apropiados. – julkiewicz