首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用#测试参数是否为字符串或对象

如何使用#测试参数是否为字符串或对象
EN

Stack Overflow用户
提问于 2015-01-20 08:32:20
回答 1查看 243关注 0票数 1

Note我无法用自定义功能来修改把手的工作方式,我要求的是开箱即用的功能。

我有这个东西

代码语言:javascript
复制
"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"
         }

它也可以如下所示:

代码语言:javascript
复制
"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中,我有以下内容:

代码语言:javascript
复制
      {{#if _media.subtitles}}
        {{#each _media.subtitles}} 
            <track kind="subtitles" src="{{this}}" srclang="{{@key}}" />
        {{/each}}
      {{/if}}

但是这两者都适用,但是因为#each枚举对象/数组,所以不包含字符串(第一个json示例)。如何测试_media.subtitles是对象还是字符串,然后决定是否需要使用每一个?

我试过这个HBS

代码语言:javascript
复制
      {{#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

代码语言:javascript
复制
    "_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轨道列表中,我无法摆脱它。

更新--当然,我总是可以单独使用对象,但对于内容开发人员来说需要一点灵活性和轻松性。

EN

回答 1

Stack Overflow用户

发布于 2015-01-20 08:36:15

更新

您提到了可能将list: true作为JSON中的第一项。

如果您可以保证,如果您有一个对象,属性list设置为true,并且这是第一个属性(据我所知,JS不保证这个属性),那么您可以使用这个条件语句排除第一个元素(参见第4行):

代码语言:javascript
复制
{{#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作为硬依赖项。

因此,您可以使用 helperUnderscore方法_.isObject()_.isString()检查属性是对象还是字符串。

代码语言:javascript
复制
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语句一样使用此助手:

代码语言:javascript
复制
{{#isObject _media.subtitles}}
    //do this if subtitles is an object
{{else}}
    // do that if subtitles is not an object
{{/isObject}}

您可以更改助手,以确保else语句中有一个字符串:

代码语言:javascript
复制
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 "";
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28040743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档