Note我无法用自定义功能来修改把手的工作方式,我要求的是开箱即用的功能。
我有这个东西
"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是对象还是字符串,然后决定是否需要使用每一个?
我试过这个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轨道列表中,我无法摆脱它。
更新--当然,我总是可以单独使用对象,但对于内容开发人员来说需要一点灵活性和轻松性。
发布于 2015-01-20 08:36:15
更新
您提到了可能将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作为硬依赖项。
因此,您可以使用 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 "";
}
});https://stackoverflow.com/questions/28040743
复制相似问题