2012-07-02 9 views
10

que tienen un modelo de columna vertebral como estoPlantilla de parciales en guión bajo (al igual que en el manillar)?

var PeopleModel = Backbone.Model.extend({ 
defaults: {    
    "people": [ 
      { "username": "alan", "firstName": "Alan", "lastName": "Johnson", "phone": "1111", "email": "[email protected]" }, 
      { "username": "allison", firstName: "Allison", "lastName": "House", "phone": "2222", "email": "[email protected]" }, 
      { "username": "ryan", "firstName": "Ryan", "lastName": "Carson", "phone": "3333", "email": "[email protected]" }, 
      { "username": "ed", "firstName": "Edward", "lastName": "Feild", "phone": "4444", "email": "[email protected]" }, 
      { "username": "phil", "firstName": "Philip", "lastName": "Doom", "phone": "5555", "email": "[email protected]" }, 
      { "username": "gerald", "firstName": "Gerald", "lastName": "Butler", "phone": "6666", "email": "[email protected]" } 
    ], 
    "company": {"name": "Random Corp."}, 
    "country": "England" 
} 

}); 

Y a continuación son mis plantillas

<script id="people-template" type="text/x-handlebars-template"> 
{{#each people}} 
    {{> person}} 
{{/each}} 
</script> 

<script id="person-partial" type="text/x-handlebars-template"> 
<div class="person"> 
    <h2>{{fullName}} </h2> 
    <div class="phone">{{phone}}</div> 
    <div class="email"><a href="mailto:{{email}}">{{email}}</a></div>  
</div> 

Así es como he implementado utilizando handlebars.js parciales.

Mis preguntas

1.Do que tienen algo similar, me refiero a los parciales en caso de motor de plantillas underscore.js?

2. Si así que ¿cómo ponemos en práctica parcial en el motor de plantillas underscore.js

Respuesta

16

No, no hay un apoyo parcial nativa en las plantillas de subrayado. Pero puedes poner casi cualquier JavaScript que quieras dentro de <% ... %>; en particular, puede llamar a sus propias funciones para que pueda agregar algo parcial-ish sin mucha dificultad. Usted podría tener una plantilla como esta:

<script id="people-template" type="text/x-handlebars-template"> 
    <% _(people).each(function(person) { %> 
     <%= partial('person', person) %> 
    <% }) %> 
</script> 

y luego añadir un partial función para window:

window.partial = function(which, data) { 
    var tmpl = $('#' + which + '-partial').html(); 
    return _.template(tmpl)(data); 
}; 

Demostración: http://jsfiddle.net/ambiguous/HDuj5/9/

Eso no es tan hábil y bonita como {{> ... }} en manillares, pero Las plantillas de Underscore son una envoltura muy delgada alrededor de JavaScript y eso te limita un poco. Puede usar espacios de nombres para evitar poner cosas directamente en window o puede usar el {variable: ...} option to _.template y un contenedor para configurar sus ayudantes estándar.

+0

Gracias por responder pacientemente a mi pregunta, su violín ha ayudado mucho. Me olvidé por completo de usar "ventana" para este caso. De nuevo, – bhargav

+1

Tenga en cuenta que la versión de dos argumentos de '_.template()' con datos como el segundo argumento se ha depreciado a partir de la versión 1.7. El enfoque sigue siendo sólido, sin embargo. –

+0

@ PeterV.Mørch: Gracias por el recordatorio. De hecho, he respondido un poco de "por qué no' _.template (tmpl, data) 'work?" preguntas recientemente. –

13

O para evitar el uso de alcance mundial se puede mezclar en ayudantes de plantillas globales, así:

(function() { 
    var originalUnderscoreTemplateFunction = _.template; 
    var templateHelpers = {}; 

    _.mixin({ 
     addTemplateHelpers : function(newHelpers) { 
      _.extend(templateHelpers, newHelpers); 
     }, 

     template : function(text, data, settings) { 
      // replace the built in _.template function with one that supports the addTemplateHelpers 
      // function above. Basically the combo of the addTemplateHelpers function and this new 
      // template function allows us to mix in global "helpers" to the data objects passed 
      // to all our templates when they render. This replacement template function just wraps 
      // the original _.template function, so it sould be pretty break-resistent moving forward. 

      if(data) 
      { 
       // if data is supplied, the original _.template function just returns the raw value of the 
       // render function (the final rentered html/text). So in this case we just extend 
       // the data param with our templateHelpers and return raw value as well. 

       _.defaults(data, templateHelpers); // extend data with our helper functions 
       return originalUnderscoreTemplateFunction.apply(this, arguments); // pass the buck to the original _.template function 
      } 

      var template = originalUnderscoreTemplateFunction.apply(this, arguments); 

      var wrappedTemplate = function(data) { 
       _.defaults(data, templateHelpers); 
       return template.apply(this, arguments); 
      }; 

      return wrappedTemplate; 
     } 
    } 
} 

A continuación, llame

_.addTemplateHelpers({ 
    partial : function() { 
     return _.template(
      $('#' + which + '-partial').html(), 
      data 
     ); 
    } 
}); 

Aquí hay un enlace a la underscore mixin en github.

+0

¿Podría hacer algo con _.partial y _.template para lograr esto? – backdesk

+0

_.partial no está relacionado con los parciales de la plantilla: rellena los argumentos en las funciones. – Dtipson

1

creo que esto es similar a la respuesta de Dave, pero tal vez requiere menos código:

function partialTemplate(origTemplate, partialValues){ 
    return function(values){ 
     return origTemplate(_.defaults(values, partialValues)); 
    }; 
} 

Ejemplo de uso:

var t = _.template('<%= val1 %>,<%= val2 %>'); // original template requiring 2 values 
var pt = partialTemplate(t, {val1:1}); // partial template with 1 value pre-populated 
pt({val2:2}); // returns '1,2' 
pt({val2:3}); // returns '1,3' 
Cuestiones relacionadas