注意我无法像Handlebars一样使用自定义功能进行修改,我问的是开箱即用的功能。
我有这个对象
"media": {
"mp4": "course/en/video/03_01_030_02.mp4",
"ogv": "course/en/video/03_01_030_02.ogv",
"subtitles": "course/en/video/03_01_030_02_sub.srt"
}
也可能如下所示:
"media": {
"mp4": "03_01_030_02.mp4",
"ogv": "03_01_030_02.ogv",
"subtitles": {
"en":"en/03_01_030_02_sub.srt",
"pl":"pl/03_01_030_02_sub.srt"
}
}
在HBS
我有这个:
{{#if _media.subtitles}}
{{#each _media.subtitles}}
<track kind="subtitles" src="{{this}}" srclang="{{@key}}" />
{{/each}}
{{/if}}
但这适用于两者,但因为#each
枚举了对象/数组,所以不包括字符串(第一个json示例)。如何测试_media.subtitles
是对象还是字符串然后我可以决定是否需要使用#each?
我试过这个HBS
:
{{#if _media.subtitles}}
{{#if _media.subtitles.list}}
{{#each _media.subtitles}}
<track kind="subtitles" src="{{this}}" srclang="{{@key}}" />
{{/each}}
{{else}}
<track kind="subtitles" src="{{_media.subtitles}}" srclang="en" />
{{/if}}
{{/if}}
和JSON
"_media": {
"mp4": "03_01_020.mp4",
"ogv": "03_01_020.ogv",
"subtitles": {
"list":true,
"en":"en/03_01_020_sub.srt",
"pl":"pl/03_01_020_sub.srt"
}
}
然后'列表'最终出现在CC曲目列表中,我无法摆脱。
更新 当然,我总是可以单独使用对象,但希望内容开发人员具有一定的灵活性和易用性
答案 0 :(得分:1)
<强>更新强>
您提到list: true
可能有JSON
作为第一项
如果你可以保证,如果你有一个对象,你将属性list
设置为true
,这是第一个属性(据我所知,JS不能保证),你可以使用此条件语句来排除第一个元素(参见第4行):
{{#if _media.subtitles}}
{{#if _media.subtitles.list}}
{{#each _media.subtitles}}
{{#if @index}} {{! <-- THIS, because 0 evaluates to false }}
<track kind="subtitles" src="{{this}}" srclang="{{@key}}" />
{{/if}}
{{/each}}
{{else}}
<track kind="subtitles" src="{{_media.subtitles}}" srclang="en" />
{{/if}}
{{/if}}
Backbone
将Underscore
作为硬依赖。
因此,您可register a Handlebars
helper使用Underscore
方法_.isObject()
和_.isString()
检查属性是对象还是字符串:
Handlebars.registerHelper('isObject', function(test, options) {
if (_.isObject(test)) { // check if this is an object
return options.fn(this);
} else { // treat is as a string otherwise
return options.inverse(this);
}
});
然后,在模板中,您可以使用此帮助程序,就像它是普通的if...else
语句一样:
{{#isObject _media.subtitles}}
//do this if subtitles is an object
{{else}}
// do that if subtitles is not an object
{{/isObject}}
您可以更改帮助程序以确保else
语句中包含字符串:
Handlebars.registerHelper('isObject', function(test, options) {
if (_.isObject(test)) { // check if this is an object
return options.fn(this);
} else if (_.isString(test)) { // check if this is a string
return options.inverse(this);
} else { // do nothing otherwise
return "";
}
});