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?
"el éxito de la clonación"? ¿Crees que llamar a 'get' es gratis? –
@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
"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. –