2012-07-02 12 views
10

aşağıda buKısmi olarak kısmi şablonlar (tıpkı gidonlarda olduğu gibi)?

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

}); 

Ve benzeri bir omurga modeli

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

Bu benim kısmi kullanarak handlebars.js hayata nasıl benim şablonlardır var.

Sorularım

1.Do biz benzer bir şey var, ben örtmek underscore.js şablon motorun Partials demek? Biz underscore.js şablon motoru

cevap

16

Hayır, alt çizgi şablonlarına hiçbir yerli kısmi destek var kısmi uygularım nasıl bu kadar

2.If. Ancak, istediğiniz herhangi bir JavaScript'i <% ... %>; Özellikle, kendi fonksiyonlarınızı arayabilirsin, böylece çok zor olmadan kısmi-ish bir şey ekleyebilirsin. Böyle bir şablon olabilir:

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

ve daha sonra partial işlev window eklemek:

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

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

oldukça olarak kaygan değil ve gidonun oldukça olarak {{> ... }} ama Underscore'un şablonları, JavaScript'in etrafındaki çok ince bir sarıcıdır ve bu sizi biraz sınırlar. Öğeleri doğrudan window içine koymaktan kaçınmak için ad alanlarını kullanabilir veya standart yardımcılarınızı kurmak için {variable: ...} option to _.template ve bir sarıcı kullanabilirsiniz.

+0

sayesinde sizin keman çok yardımcı oldu. Bu dava için "window" kullanmayı tamamen unuttum. Thnks tekrar – bhargav

+1

İkinci argüman olarak veri ile _.template() 'in iki argüman versiyonunun sürüm 1.7'den itibaren kullanımdan kaldırıldığını unutmayın. Yine de yaklaşım hala sağlam. –

+0

@ PeterV.Mørch: Hatırlatıcı için teşekkürler. Aslında bazı cevaplar verdim "neden çalışmıyor? (Tmpl, data)" çalışıyor? " son zamanlarda sorular. –

13

Yoksa şöyle global şablon yardımcıları içinde karıştırabilirsiniz küresel kapsamı kullanmaktan kaçınmak için:

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

Sonra Burada

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

çağrı github underscore mixin bağlantısıdır.

+0

Bunu başarmak için _.partial ve _.template ile bir şeyler yapabilir misiniz? – backdesk

+0

_.partial, şablon bölümleriyle ilişkili değildir: işlevlerdeki argümanları doldurur. – Dtipson

1

Bu Dave'in cevaba benzer olduğunu düşünüyorum, ama belki de daha az kod gerektiren:

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

Örnek kullanım: sabırla soruma cevap için

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'