2012-07-02 33 views
10

我有这样下划线中的部分模板(就像在把手中)?

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

}); 

且低于骨干模型是我的模板

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

我这是怎么实现的使用handlebars.js部分。

我的问题

1.Do我们有类似的事情,我的意思是柜面underscore.js模板引擎的谐音?

2,如果这样,我们如何实现underscore.js模板引擎

回答

16

没有,是下划线的模板没有本地部分支持部分。但是,您可以在<% ... %>之内放入几乎所有您想要的JavaScript;特别是,你可以调用你自己的函数,这样你就可以毫无困难地添加一些部分。你可以有这样的一个模板:

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

,然后添加一个partial功能window

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

演示:http://jsfiddle.net/ambiguous/HDuj5/9/

这是不是很光滑,漂亮,{{> ... }}在车把但Underscore的模板是JavaScript本身的一个非常简单的包装,它限制了你的工作。您可以使用命名空间来避免将东西直接放在window中,或者您可以使用{variable: ...} option to _.template和包装来设置标准助手。

+0

谢谢你耐心地回答我的问题,你的小提琴帮了不少忙。我完全忘记了为这种情况使用“窗口”。再次请注意 – bhargav

+1

请注意,数据作为第二个参数的'_.template()'的双参数版本已从版本1.7开始删除。尽管如此,这种方法仍然很有用。 –

+0

@PeterV.Mørch:谢谢你的提醒。我实际上回答了一些“为什么'_.template(tmpl,data)'工作?”最近的问题。 –

13

或避免使用全球范围内,你可以在全局模板助手混合像这样:

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

然后调用

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

这里是给underscore mixin在GitHub上的链接。

+0

你能用_.partial和_.template做些什么来达到这个目的吗? – backdesk

+0

_.partial与模板偏好无关:它在函数中填充参数。 – Dtipson

1

我认为这是类似于Dave的答案,但也许需要更少的代码:

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

用法示例:

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'