2012-05-01 14 views
13

la plantilla se ve así.al pasar una variable a una plantilla de red troncal, ¿cómo hacer referencia a ella en la plantilla?

<div> 
    <H5>Status for your request</H5> 
    <table> 
    <tbody> 
    <tr> 
     <th>RequestId</th> 
     <th><%=id%></th> 
    </tr> 
    <tr> 
     <th>Email</th> 
     <th><%=emailId%></th> 
    </tr>  
    <tr> 
     <th>Status</th> 
     <th><%=status%></th> 
    </tr>  
    </tbody> 
    </table> 
</div> 

Esta es la Vista Javascript que hace la página.

window.StatusView = Backbone.View.extend({ 

initialize:function() { 
    console.log('Initializing Status View'); 
    this.template = _.template(tpl.get('status')); 
}, 

render:function (eventName) { 

    $(this.el).html(this.template()); 
    return this; 
}, 

events: { "click button#status-form-submit" : "getStatus" }, 

getStatus:function(){ 

    var requestId = $('input[name=requestId]').val(); 
    requestId= $.trim(requestId); 

    var request = requests.get(requestId); 

    var statusTemplate = _.template(tpl.get('status-display')); 
    var statusHtml = statusTemplate(request); 
    $('#results-span').html(statusHtml); 
} 

}); 

Cuando los clics en la entrada, el RequestID es leído y el estado se adjunta en el elemento html con el ID 'resultados-palmo'.

La falla ocurre al reemplazar los valores en html-template con valores variables.

var statusTemplate = _.template(tpl.get('status-display')); 
var statusHtml = statusTemplate(request); 

La representación falla con el siguiente error.

Uncaught ReferenceError: emailId is not defined 
(anonymous function) 
_.templateunderscore-1.3.1.js:931 
window.StatusView.Backbone.View.extend.getStatusstatus.js:34 
jQuery.event.dispatchjquery.js:3242 
jQuery.event.add.elemData.handle.eventHandle 

Respuesta

21

de _.template Subrayado:

plantillas Compila JavaScript en funciones que pueden ser evaluados para la representación.
[...]

var compiled = _.template("hello: <%= name %>"); 
compiled({name : 'moe'}); 
=> "hello: moe" 

Así que, básicamente, que la mano de la función de plantilla de un objeto y la plantilla se ve dentro de ese objeto para los valores que utiliza en su plantilla; si usted tiene esto:

<%= property %> 

en su plantilla y se llama a la función de plantilla como t(data), entonces la función de plantilla buscará data.property.

Por lo general, a convertir el modelo de la vista a JSON y de la mano de ese objeto a la plantilla:

render: function (eventName) { 
    $(this.el).html(this.template(this.model.toJSON())); 
    return this; 
} 

No sé lo que su eventName es o lo que usted está planeando hacer con él, pero lo que necesita obtener un objeto con esta estructura:

data = { id: '...', emailId: '...', status: '...' } 

de alguna parte y mano que a la función de plantilla:

var html = this.template(data) 

para obtener algo de HTML para poner en la página.

Demo (con un modelo de falsa con fines ilustrativos): http://jsfiddle.net/ambiguous/hpSpf/

+1

Gracias por los punteros. En lugar de aprobar el modelo Backbone, pasé un objeto javascript puro creado a partir del modelo. 'var data = {id: request.get ('id'), emailId: request.get ('emailId'), estado: request.get ('status')};'. Ahora la plantilla lo está renderizando bien. ¿Cuál es la diferencia entre el modelo BackBone y el objeto JS puro? – Nambi

+0

@Nambi: las vistas generalmente muestran modelos o colecciones en Backbone y ese modelo o colección está en ['this.model' o' this.collection'] (http://documentcloud.github.com/backbone/#View-constructor) .Luego, traduce el modelo/colección a una estructura de datos JavaScript simple utilizando el método ['toJSON'] (http://documentcloud.github.com/backbone/#Model-toJSON). Si 'request' es un modelo Backbone, su' var data = {...} 'es lo mismo que' var data = request.toJSON() ', excepto que' toJSON' incluirá todos los atributos 'request'. A la plantilla le importa, solo quiere un objeto con las teclas correctas. –

2
OptionalExtrasView = Backbone.View.extend({ 
    initialize: function() { 
     this.render(); 
    }, 
    render: function() { 
     // Get the product id 
     //var productid = $(this).attr("productid"); 
     var data = {name : 'moe'}; 

     var tmpl = _.template($('#pddorder_optionalextras').html()); 
     this.$el.html(tmpl(data)); 
    } 
}); 

    var search_view = new OptionalExtrasView({ el :  $('.pddorder_optionalextras_div')}); 

y justo antes de la etiqueta de cuerpo:

 <script type="text/template" id="pddorder_optionalextras"> 
    <%= name %> 
    </script> 
+0

Lo consigo usando Node.js, El mensaje de error es ----> el nombre no está definido –

+0

Creo que esto se debe a que debería usar plantillas de EJS no subrayar plantillas –

Cuestiones relacionadas