Javascript 是否可以根据Mustach中的哈希值切换模板部分?
好的,我试着掌握一下Mustache.js,以便在javascript中呈现视图。我有一个API,它可以返回许多不同类型的事件。我希望根据事件的类型,以非常不同的方式呈现事件:Javascript 是否可以根据Mustach中的哈希值切换模板部分?,javascript,json,mustache,Javascript,Json,Mustache,好的,我试着掌握一下Mustache.js,以便在javascript中呈现视图。我有一个API,它可以返回许多不同类型的事件。我希望根据事件的类型,以非常不同的方式呈现事件: data : { events: [ {title: 'hello', type: 'message'}, {title: 'world', type: 'image'} ] } 理想情况下,我可以这样做: {{#events}} {{#message}} <div class="
data : {
events: [ {title: 'hello', type: 'message'}, {title: 'world', type: 'image'} ] }
理想情况下,我可以这样做:
{{#events}}
{{#message}}
<div class="message">{{title}}</div>
{{/message}}
{{#image}}
<span>{{title}}</span>
{{/image}}
{{/events}}
有没有更好的方法来解决这个问题,而不必重构我的数据?或者我应该咬紧牙关吗?小胡子没有逻辑性,因此除了切换到模板代码之外,你对纯模板代码无能为力 您的胡须友好的替代方法是声明一个助手,并使用它来选择要渲染的模板。它变得有点复杂,但如果你不能改变的话,你可以避免不留胡子:
var base_template = '{{#events}}' +
'{{{event_renderer}}}' +
'{{/events}}';
var message_template = '<div>message: {{title}}</div>';
var image_template = '<div>image: {{title}}</div>';
var data = {
events: [ {title: 'hello', type: 'message'}, {title: 'world', type: 'image'} ],
event_renderer: function() {
return Mustache.render('{{> ' + this.type + '}}', this, {message: message_template, image: image_template});
}
}
Mustache.render(base_template, data);
这里的技巧是创建一个作为迭代器的基本模板,并将事件\渲染器作为辅助对象传入。该助手将再次调用Mustache.render,使用partials来呈现每种类型的事件,即{{>partial}}表示法
这里唯一难看的地方是,您需要将这个event_renderer成员添加到JSON数据中,但除此之外,在Handlebars中应该都可以。您可以将其声明为帮助程序,而无需将其与您的数据合并。我已经接受了您的答案,但您介意在这里给我一些输入吗?我正在寻找一个简单而诱人的系统,但目前我可以选择任何一种方式——API仍在构建中,而实际的GUI部分还没有构建。你会建议用车把而不是胡子吗?或者一起使用另一个库?对于此特定示例,不同之处在于您可以使用handlebar.registerHelper全局注册event_renderer helper,避免每次有新数据要渲染时都必须混合使用此函数。简而言之,车把上没有语法可用于根据一个成员的值渲染一个或另一个部分,只能测试truthy和falsy值。
var base_template = '{{#events}}' +
'{{{event_renderer}}}' +
'{{/events}}';
var message_template = '<div>message: {{title}}</div>';
var image_template = '<div>image: {{title}}</div>';
var data = {
events: [ {title: 'hello', type: 'message'}, {title: 'world', type: 'image'} ],
event_renderer: function() {
return Mustache.render('{{> ' + this.type + '}}', this, {message: message_template, image: image_template});
}
}
Mustache.render(base_template, data);