【问题标题】:Input type="number" error value "{{}}" cannot be parsed, or is out of range with handlebars.jsinput type=\"number\" 错误值 \"{{}}\" 无法解析,或者超出 handlebars.js 范围
【发布时间】:2023-01-30 03:38:23
【问题描述】:

当我使用 handlebars.js 将值设置为输入类型 =“数字”标签时,我收到警告。

模板的html是:

<input id="i-f" type="number" class="form-control full-width" value="{{m_f}}" />

我传递了以下值:

objname = {
m_f: 3
}

加载车把模板后,控制台会显示此警告:

指定的值“{{m_f}}”无法解析,或者超出范围。

我已经尝试使用和不使用双引号 (") 和第三个大括号来设置值,但没有任何变化。我不明白我哪里做错了。

即使出现此警告,该值也已设置正确,但我该如何解决?

我正在使用 handlebars 4.7.7 和 jquery 2.2.4

对不起,我的马铃薯英语 :P,我希望我说的很清楚。谢谢!

编辑

车把模板的调用是:

内置功能

 LoadDeviceTemplate(options.data, selector, options.templateURL, true, options.selector, false);

那次跑步:

var template = GetHBTemplate(urlHtml, innerSelector);

.html 文件的 ajax 调用在哪里运行

$.ajax({
        async: false,
        url: urlHtml + "?ts=" + daysfromepoch
        cache: true,
        success: function (data) {
            var $d = $(data);
                            
            var scriptid = null,scriptSelIsPresent = 0 ,onlyScriptSel=0;
            if ($d.is("script[type='text/x-handlebars-template']")) {
                

                scriptid = $d.filter("script").attr("id");
                if ((innerSelector + " ").indexOf("#" + scriptid + " ") == 0) {
                    scriptSelIsPresent = 1;
                    if (innerSelector.length == scriptid.length + 1)
                       
                        onlyScriptSel=1;
                }
        
                
                if (scriptSelIsPresent) {
                    if (onlyScriptSel) {                            
                        shtml = $d.text();                            
                        return;
                    }
                    
                    innerSelector = innerSelector.substring(("#" + scriptid + " ").length);                          
                   
                }
                $d = $($d.text());
            }
            var $f = $d.filter(innerSelector);

            if ($f.length > 0) {
                if ($f.attr("type") == "text/x-handlebars-template")
                    shtml = $f.html();
                else
                    shtml = $f[0].outerHTML;
            }
            else {
                var complexSelector = innerSelector.indexOf("=") >= 0;
                var arr = innerSelector.split(" ");
                var id = arr.shift();
                if (!complexSelector && arr.length > 0 && $d.filter(id).length)
                    shtml = $($d.filter(id).html()).find(arr.join(" "))[0].outerHTML;
                else
                    shtml = $d.find(innerSelector)[0].outerHTML;
            }
        }
    });

运行“$d = $($d.text());”行时出现警告

【问题讨论】:

  • 我们可以看到调用模板函数的代码吗?
  • @76484 嗨,我刚刚更新了线程。您需要更多信息吗?
  • 谢谢。什么是LoadDeviceTemplate和GetHBTemplate?这些功能是您创建的吗?
  • 有很多继续在这里,我发现很难理解。最重要的是,我看不到您的 Handlebars 模板函数是在哪里编译的 (Handlebars.compile)。所以我不清楚这里是否使用了 Handlebars。
  • @76484 抱歉,伙计,我忘了复制粘贴 GetHBTemplate 的最后一行,即:return Handlebars.compile(shtml);返回的模板将使用此命令在 LoadDeviceTemplate 中完成 $(selector).append(template(dev)); dev 是具有要放入车把模板中的值的对象我希望这次我没有忘记其他东西

标签: javascript jquery handlebars.js


【解决方案1】:

此警告不是由 Handlebars 发出的,而是由 jQuery 发出的。这是一个有效的警告,因为使用代码 $d = $($d.text());,您要求 jQuery 使用 [type="number"] 和 [value="{{m_f}}"] 解析 &lt;input&gt; 元素。 jQuery 知道 {{m_f}} 是不是一个有效的数字,所以它警告你这个事实。

在您的情况下,将 {{m_f}} 作为 input[type="number"] 元素的值是可以接受的,因为您将采用该元素的字符串化表示并将其提交给 Handlebars 以创建模板函数。

因此,我认为您忽略来自 jQuery 的此警告是合理且合理的。

作为您代码的读者,我倾向于建议可以对其进行简化,以便更易于阅读和理解。我认为您很有可能不需要在 jQuery 中多次重新包装您的模板,并且您也许能够重构产生警告的 $d = $($d.text());。但是,我无法理解所有的过滤和发现您稍后在函数中所做的以便能够为您重写此功能。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2015-04-27
    • 2019-06-04
    • 2018-11-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多