Método de la plantilla de Backbone. ¿Por qué estamos pasando en un modelo?

No puedo entender por qué estamos pasando un modelo.toJSON () en esta plantilla:

app.TodoView = Backbone.View.extend({ tagName: 'li', template: _.template($('#item-template').html()), render: function(){ this.$el.html(this.template(this.model.toJSON())); return this; // enable chained calls } }); 

El ejemplo proviene de este tutorial .

this.template(this.model.toJSON()) es la parte más confusa para mí. El método de la plantilla no parece incluir un argumento, ¿verdad? Que esta pasando?

_.template función subrayar _.template toma una cadena de plantilla como argumento (y opcionalmente un objeto de configuración) y devuelve una nueva función de plantilla precomstackda que toma un objeto como argumento.

Este objeto son los datos usados ​​dentro de la plantilla:

 // creates a template function var templateFunc = _.template("<%= name %>"); // render the template using the passed data templateFunc({ name: "Émile" }); // Émile 

Por defecto, la template coloca los valores de sus datos en el ámbito local a través de la instrucción with . Sin embargo, puede especificar un único nombre de variable con la configuración de la variable .

 _.template("Using 'with': <%= data.answer %>", {variable: 'data'})({answer: 'no'}); 

model.toJSON() devuelve una copia superficial o los attributes hash del modelo.

Para lograr el equivalente del ejemplo anterior:

 var model = new Backbone.Model({ name: "Émile" }); templateFunc(model.toJSON()); // Émile 

Para Underscore.js anterior a v1.7 , la firma de la función de la plantilla era un poco diferente:

 _.template(templateString, [data], [settings]) 

Si se pasaba un objeto de datos, no devolvía una función, sino que devolvía la cadena de plantilla representada directamente.

 _.template('This is <%= val %>.', { val: "deprecated" }); // This is deprecated.