2012-07-02 7 views
10

mam model kręgosłup jak tenSzablon części w podkreśleniu (tak jak w kierownicy)?

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" 
} 

}); 

i poniżej są moje szablony

<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> 

To jak ja częściowe realizowane za pomocą handlebars.js.

Moje pytania

1.Do mamy coś podobnego, to znaczy, że partials okrywać underscore.js silnika szablonu?

2.Jeżeli tak jak możemy wdrożyć częściowe w underscore.js szablonu silnika

Odpowiedz

16

Nie, nie ma natywne wsparcie częściowy w szablonach podkreślenia jest. Ale możesz umieścić prawie dowolny kod JavaScript, który chcesz wewnątrz <% ... %>; w szczególności możesz wywoływać własne funkcje, dzięki czemu możesz dodać coś częściowego, bez większych trudności. Można mieć szablon takiego:

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

a następnie dodać partial funkcję do window:

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

Demo: http://jsfiddle.net/ambiguous/HDuj5/9/

to nie jest aż tak zręczny i ładna jak {{> ... }} w kierownicy ale Szablony podkreślenia są bardzo cienkim opakowaniem samej JavaScript i to nieco ogranicza. Możesz używać przestrzeni nazw, aby uniknąć umieszczania rzeczy bezpośrednio w window lub możesz użyć {variable: ...} option to _.template i opakowania, aby skonfigurować standardowych pomocników.

+0

Dzięki za cierpliwie odpowiadając na moje pytanie, twoje skrzypce pomogło. Całkowicie zapomniałem o użyciu "okna" dla tego przypadku. Thnks again – bhargav

+1

Pamiętaj, że dwuargumentowa wersja '_.template()' z danymi jako drugim argumentem została usunięta z wersji 1.7. Podejście jest jednak nadal dobre. –

+0

@ PeterV.Mørch: Dzięki za przypomnienie. Odpowiedziałem na pytanie "dlaczego nie działa" _.template (tmpl, data) "? pytania ostatnio. –

13

Albo unikać globalny zasięg można mieszać w globalnych pomocników szablonu tak:

(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; 
     } 
    } 
} 

Następnie zadzwonić

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

Tu jest link do underscore mixin na github.

+0

Czy możesz coś zrobić z _.partial i _.template, aby to osiągnąć? – backdesk

+0

_.partial nie jest powiązany z częściowymi szablonami: wypełnia argumenty w funkcjach. – Dtipson

1

myślę, że jest podobna do odpowiedzi Dave'a, ale być może wymagając mniej kodu:

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

Przykład użycia:

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' 
Powiązane problemy