2013-08-28 34 views
3

TL; DRHandlebars.js - 建立一个模板模板

在下面的把手模板...

<div class="field field-label"> 
    <label>{{label}}</label><input type="text" value="{{{{attribute}}}}"> 
</div> 

我需要的{{属性}}进行评估,但value="{{值属性}}"要打印。

背景

我已经有了一个模板一个有趣的使用。我的应用程序有几十个表单(并且不断增长!),以及几种显示它们的方法。显然,它们可以显示在浏览器,移动设备或PDF等等中。所以我想要做的就是用JSON定义这些表单,以便像MongoDB那样生活。这样,即使不更新HTML视图,移动应用和PDF渲染功能,也可以轻松修改它们。

{ 
    title: 'Name of this Form', 
    version: 2, 
    sections: [ 
    { 
     title: 'Section Title', 
     fields: [ 
     { 
      label: 'Person', 
      name: 'firstname', 
      attribute: 'FIRST', 
      type: 'text' 
     }, { 
      label: 'Birthday', 
      name: 'dob', 
      attribute: 'birthday', 
      type: 'select', 
      options: [ 
      { label: 'August' }, 
      { label: 'September' }, 
      { label: 'October' } 
      ] 
     }, 
     ... 
     ... 

这是一种滋味。所以type: 'text'结果<input type="text">,name是输入的名称,attribute是来自模型yada yada的属性。它与嵌套的可选表单相当复杂,但你明白了。

问题是,现在我有两个上下文。第一个是带有表单数据的JSON,第二个是来自模型的JSON。我认为有两个选择我认为会很好。

溶液1

包含已注册作为辅助模型上下文快速小闭合。

var fn = (function(model) { 
    return function(attr) { 
    return model[attr] 
    } 
})(model); 

Handlebars.registerHelper('model', fn) 

...使用像这样...

<input type="text" name="{{name}}" value="{{model attribute}}"> 

溶液2张

两个通行证。让我的模板输出一个模板,然后我可以使用我的模型进行编译和运行。一个很大的优点,我可以预编译表单。我更喜欢这种方法。这是我的问题。 如何从我的模板中打印出{{属性}}?

例如,在我的文本模板...

<div class="field field-label"> 
    <label>{{label}}</label><input type="text" value="{{{{attribute}}}}"> 
</div> 

我需要{{attribute}}进行评估和{{属性}的值}进行打印。

+0

我想我可以用一个帮手来打印'{{}}'呵呵...... –

+0

Soln 1看起来不错。 –

回答

0

我去了解决方案2,有点。对我来说,我可以预先编译表单sans数据对我很重要。所以我所做的只是添加了一些帮助功能...

Handlebars.registerHelper('FormAttribute', function(attribute) { 
    return new Handlebars.SafeString('{{'+attribute+'}}');  
}); 

Handlebars.registerHelper('FormChecked', function(attribute) { 
    return new Handlebars.SafeString('{{#if ' + attribute + '}}checked="checked"{{/if}}'); 
}); 

...我可以在我的表单模板中使用...

<input type="text" name="{{name}}" value="{{FormAttribute attribute}}"> 

...导致......

<input type="text" name="FirstName" value="{{FirstName}}"> 

我仍然有兴趣了解是否有一些方法有把手忽略,而不是解析大括号{{}}不使用助手。