【问题标题】:Handlebars multi select helpers车把多选助手
【发布时间】:2019-01-05 12:29:39
【问题描述】:

我需要车把助手方面的帮助:

从数据库中选择的数据:

{ _id: 5b598e31f24e7f820d2d422d, key: 'c-1', name: 'C#' },
{ _id: 5b598e61f24e7f820d2d4234, key: 'node-js', name: 'Node.js'} 

HBS 生成动态选择选项:

{{#each tags}}
<option value="{{_id}}">{{name}}</option>
{{/each}}

HTML:

<select multiple="" class="custom-select" name="skills">
    <option value="5b598e22f24e7f820d2d422b">Javascript</option>
    <option value="5b598e29f24e7f820d2d422c">C++</option>
    <option value="5b598e31f24e7f820d2d422d">C#</option>
    <option value="5b598e61f24e7f820d2d4234">Node.js</option>
</select>

如何将selected="selected"添加到具有相同ID的选项中?有什么优雅的解决方案吗?

对于单选字段,我使用代码:

{{#select post.position.id}}
 {{#each categories}}
 <option value="{{id}}">{{name}}</option>
 {{/each}}
{{/select}}

helpers.js

_helpers.select =  function(selected, options){
        return options.fn(this).replace(new RegExp(' value=\"'+ selected + '\"'), '$&selected="selected"');

}

【问题讨论】:

    标签: javascript html select handlebars.js helpers


    【解决方案1】:

    您可以使用这样的助手来测试您的字符串是否相同:

    Handlebars.registerHelper('test', function(lvalue, operator, rvalue, options) {
        var doDisplay = false;
        var items = (""+rvalue).split("|");
        var arrayLength = items.length;
        for (var i = 0; (i < arrayLength); i++) {
            if (operator == "eq") {
                if (lvalue == items[i]) {
                    doDisplay = true;
                }
            } else if (operator == "ne") {
                if (lvalue != items[i]) {
                    doDisplay = true;
                }
            } else if (operator == "gt") {
                if (parseFloat(lvalue) > parseFloat(items[i])) {
                    doDisplay = true;
                }
            } else if (operator == "lt") {
                if (parseFloat(lvalue) < parseFloat(items[i])) {
                    doDisplay = true;
                }
            }else if (operator == "le") {
                if (parseFloat(lvalue) <= parseFloat(items[i])) {
                    doDisplay = true;
                }
            }else if (operator == "ge") {
                if (parseFloat(lvalue) >= parseFloat(items[i])) {
                    doDisplay = true;
                }
            }
        }
        if (doDisplay) {
            return options.fn(this);
        } else {
            return "";
        }
    });
    

    然后像这样在你的 HTML 代码中使用帮助器:

    <select multiple="" class="custom-select" name="skills">
        <option value="5b598e22f24e7f820d2d422b" {{#test name 'eq' 'Javascript'}}selected{{/test}}>Javascript</option>
        <option value="5b598e29f24e7f820d2d422c" {{#test name 'eq' 'C++'}}selected{{/test}}>C++</option>
        <option value="5b598e31f24e7f820d2d422d" {{#test name 'eq' 'C#'}}selected{{/test}}>C#</option>
        <option value="5b598e61f24e7f820d2d4234" {{#test name 'eq' 'Node.js'}}selected{{/test}}>Node.js</option>
    </select>
    

    【讨论】:

    • 选择选项中的值是动态的。我正在更新我的问题。你知道如何解决这个问题吗?
    • 在我看来,您的正则表达式中缺少 1 : .replace(new RegExp(' value=\"'+ selected + '\"'), '$1 selected="selected" ') 在我看来更好。当然,如果您照常做,那么您就不需要测试助手。
    • 不幸的是它没有帮助
    猜你喜欢
    • 2020-04-02
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多