2012-04-25 11 views
7

Cuando uso backbone.js y el motor de plantillas complementario en guión bajo, me he dado cuenta de que la mayoría de los ejemplos llaman a model.ToJSON() al representar en lugar de simplemente pasar model. Entiendo que mi plantilla debería modificar cómo recupera los datos.Plantilla Backbone/Underscore: ¿cuándo renderizar por qué llamar a JSON?

Me pregunto por qué & qué beneficio obtenemos de toJSON()?

ejemplo típico

En el ejemplo típico model.toJSON() se llama cuando la prestación. Tenga en cuenta, en aras de la brevedad, pongo la plantilla como una cadena literal.

ToDoItemView = Backbone.View.extend({ 
    /* other viewey stuff */ 
    template : _.template('<li><%=ToDoNote%></li>'), 
    render : function() {  
        var out= this.template(this.model.toJSON()); //<--JSON 
        $(this.el).html(out) } 
        return this; 
       } 
}); //end view 

Método alternativo Una

me buscó en la columna vertebral 0.9.2 1.3.3 & subrayan código. En la red troncal, se dio cuenta de que model.toJSON() hace lo siguiente: _.clone(this.attributes). Dentro del motor de representación de plantillas, mi plantilla compilada nombra los datos pasados ​​obj.

Después de ver esos fragmentos, me di cuenta de que la clonación de los atributos no es necesaria. En cambio, puedo pasar directamente en mi modelo (aunque con algunos cambios de sintaxis en la plantilla). Algo así como ...

ToDoItemView = Backbone.View.extend({ 
    /* other viewey stuff */ 
    template : _.template('<li><%=obj.get('ToDoNote')%></li>'), //<--notice GET() 
    render : function() {  
        var out= this.template(this.model); //<-- look ma no json 
        $(this.el).html(result) } 
        return this; 
       } 
}); //end view 

En cuanto a los dos ejemplos, las únicas razones por las que puede llegar a llamar toJSON son:

  • datos del modelo protegerlo de una vista nefasto
  • la vista localmente modifica los datos (no es una buena idea en mi opinión),
  • vista necesita acceder a los valores usando la sintaxis de array/string (obj[ namepart + someindex])

Mi pregunta se reduce a: ¿por qué debería llamar al toJSON() y tomar el golpe para clonar las propiedades, en lugar de simplemente usar get() en mis plantillas?

+0

"el éxito de la clonación"? ¿Crees que llamar a 'get' es gratis? –

+0

@muistooshort - ¿Gratis? no. 'Get()' does 'return this.attributes [attr];'. Entonces, ¿una búsqueda de matriz es más rápida que una copia de matriz? Sí, desde un aspecto de recurso y tiempo, pero eso pasa por alto mi punto. Llamar 'toJSON()' está claramente integrado en el pensamiento colectivo de las comunidades centrales. Tengo curiosidad por qué. – EBarr

+0

"Llamadas a funciones repetidas y accesos a objetos" versus "un clon y accesos a objetos repetidos" y no veo ningún resultado de referencia, por lo que su * Sí * es meramente opinión (al igual que todas las respuestas, de ahí el "no" constructivo "voto". No todas las vistas van a ser un mapeo directo de un modelo o colección, 'toJSON' es más flexible y reduce el ruido en su plantilla. –

Respuesta

12

Tal vez el siguiente tiene sentido:

  1. interpolación en lugar de evaluar es un gran costo para tomar. Por lo tanto, su versión de la plantilla es en realidad mucho más lenta que llamando al toJSon() y utilizando la evaluación.

  2. La lógica pertenece a las vistas, no a las plantillas. La introducción del código js (y la necesidad de interpolación) en las plantillas solo debe hacerse si es necesario.

  3. Se podría argumentar que debe pasar model.attributes en lugar de model.toJSON() evitando el clon. Supongo que la razón para no hacerlo es evitar que la plantilla cambie los atributos del modelo.Además, es posible que normalmente desea aumentar el resultado de model.toJSON() con otras cosas, lo que obviamente no desea hacer en el model.attributes

+0

Bien dicho. Tiene mucho sentido. – EBarr

+2

Se debe tener en cuenta que al usar 'modelo.toJSON()' se desaconseja la vista ... es para serializar el modelo para la sincronización, no para la representación. Debería pasar 'model.attributes' como sugirió. https://github.com/jashkenas/backbone/issues/2134 – Cobby

+0

Incluso el uso de 'toJSON()' o '_.clone()' puede no evitar completamente que la plantilla cambie los atributos del modelo porque el método de clonación crea "una superficialidad clon copiado del objeto. Cualquier objeto o matriz anidada se copiará por referencia, no se duplicará ". (http://underscorejs.org/#clone) Por lo tanto, recomiendo usar 'model.attributes', pero tenga en cuenta que, en cualquier caso, no debe realizar cambios en el modelo a partir de la plantilla. – gfullam

2

Una razón probable es porque los desarrolladores de Backbone.js le han permitido utilizar cualquier motor de plantillas que desee, y muchos motores de plantillas funcionan con objetos javascript simples, no Modelos de red troncal.

+1

Buen punto. Aunque, estoy hablando específicamente de por qué/por qué no, de elegir esta estrategia * para una plantilla de subrayado *. – EBarr

Cuestiones relacionadas