小胡子条件和循环
以下是资源:
JSON
{ "badges":{ "unlocked": [ {"name": "Win 1"}, {"name": "Win 2"}, {"name": "Win 3"} ], "locked":[ {"name": "Lose 1"}, {"name": "Lose 2"}, {"name": "Lose 3"} ] } }
算法
{{ if_has_badges }} Badges
{{ if_has_badges_unlocked }} Unlocked!
{{ loop_badges_unlocked }} {{ name }} {{ end_loop_badges_unlocked }} {{ end_if_has_badges_unlocked }} {{ if_has_badges_locked }} Locked!
{{ loop_badges_locked }} {{ name }} {{ end_loop_badges_locked }} {{ end_if_has_badges_locked }} {{ end_if_has_badges }}
我如何编写这个算法来使用Mustache编译器?
我需要这样做才能与双方合作,首先是RubyOnRails应用程序,第二个是客户端(JavaScript)。
您的问题有两种解决方案。
使用选择和反转选择
以下是胡子文档中的示例:
{ "repos": [] }
模板:
{{#repos}}{{name}}{{/repos}} {{^repos}}No repos :({{/repos}}
输出:
No repos :(
当你看到倒置选择让我做条件逻辑。 在你的情况下,它看起来像:
JSON:
var viewModel = { badges:[]//badges here } viewModel.anyBadges = badges.length >0;
胡子:
{{#anyBadges}} Unlocked!
{{/anyBadges}} {{#badges_unlocked}} {{ name }} {{/badges_unlocked}}
不要在无逻辑模板中做逻辑
这就是我要做的。 如果你的Mustache模板中有条件逻辑,我认为你做错了。 你可以使用Handlebars而不是在这方面更先进,或者将你的逻辑移到其他地方(到你的javascript)。
请参阅Mustache自述文件
最好的答案(对于Ruby和JavaScript)是将您的逻辑( if_has_badges
类型问题)封装到View类中。
实际上,您可以使用数组length
属性伪装它,以获得Ruby和JavaScript中所需的一些逻辑:
{{# badges.length }} Badges
{{# badges.unlocked.length }} Unlocked!
{{# badges.unlocked }} {{ name }} {{/ badges.unlocked }} {{/ badges.unlocked.length }} {{# badges.locked.length }} Locked!
{{# badges.locked }} {{ name }} {{/ badges.locked }} {{# badges.locked.length }} {{/ badges.length }}
但这样做有点肮脏……