Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以根据Mustach中的哈希值切换模板部分?_Javascript_Json_Mustache - Fatal编程技术网

Javascript 是否可以根据Mustach中的哈希值切换模板部分?

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

好的,我试着掌握一下Mustache.js,以便在javascript中呈现视图。我有一个API,它可以返回许多不同类型的事件。我希望根据事件的类型,以非常不同的方式呈现事件:

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