如果参数是字符串或对象,如何使用#if进行测试

时间:2015-01-20 08:32:20

标签: json backbone.js handlebars.js

注意我无法像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曲目列表中,我无法摆脱。

更新 当然,我总是可以单独使用对象,但希望内容开发人员具有一定的灵活性和易用性

1 个答案:

答案 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}}

BackboneUnderscore作为硬依赖。

因此,您可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 "";
    }
});