【问题标题】:Onclick-function on elements in Handlebars-templateHandlebars-template 中元素的 Onclick 功能
【发布时间】:2015-07-23 14:55:22
【问题描述】:

我正在使用 Handlebars.js 和一些 jQuery 构建一个简单的 web 应用程序。

现在我有一个数据列表,我通过 Handlebars 模板呈现它们。然后我想要一些与这些相关的操作,例如更新一个元素,或删除一个元素。我有一个与这些操作相关联的按钮,问题是我无法设法让与模板中的按钮相关联的onclick-methods 工作。

我阅读了this question and answer,这导致我添加了额外的括号和辅助方法,但它仍然不起作用。请参阅下面的代码。

Handlebars.registerHelper('json', function(context) {
    return JSON.stringify(context);
});

var myGreatFunction = function(someValue) {
    // Work with that value 
}

模板:

{{#each Something}}
    <button onclick="myGreatFunction({{{json this}}})"></button>
{{/each}}

现在,像这样在 HTML 文件的顶部给我Uncaught SyntaxError: missing ) after argument list

我注意到答案here,所以我尝试使用onclick="myGreatFunction( '{{{json this}}}' )",它在HTML 文件末尾给出了错误Uncaught SyntaxError: Unexpected token ILLEGAL

使用onclick="myGreatFunction( '{{json this}}' )",按钮会在点击时消失。

有没有人看到我错过的东西,或者有其他方法吗?我想将对象添加到模板中的某个 div/button 中,然后为从模板中获取值的单击添加一个 jQuery 侦听器,但这看起来很丑陋和不清楚。

有什么建议吗?非常感谢所有帮助 - 在此先感谢。

更新: 似乎问题在于,正如 Hacketo 下面提到的,输出的 JSON 有点混乱。我检查了代码中的一个元素:

onclick="someFunc('{&quot;id&quot;:5,&quot;publisher&quot;:null,&quot;message&quot;:&quot; asdadsad&quot;,&quot;address&quot;:&quot;asdad&quot;,&quot;published&quot;:&quot
Last Saturday at 12:00 AM&quot;,&quot;createdAt&quot;:&quot;2015-07
23T09:55:35.486Z&quot;,&quot;updatedAt&quot;:&quot;2015-07-23T09:55:35.486Z&quot;}')"

(为方便起见,分成多行)。

现在我只需要找出来让 JSON 看起来正确。

【问题讨论】:

  • 可能在onclick="myGreatFunction()" 中缺少"
  • @Haketo 啊,对不起。这是我的示例中的错字,抱歉。马上修复,谢谢! =)
  • 这个错字也会抛出同样的错误。
  • @Haketo 嗯,我明白了。我不得不仔细检查我的项目,我记得在那里。尝试了上面提到的所有事情(这是新的一天),确保我没有错过",他们抛出了和以前一样的错误。不过,感谢您的提示!
  • 这与我猜想的例子完全相同:stackoverflow.com/questions/26642048/…

标签: javascript jquery handlebars.js


【解决方案1】:

这是因为 JSON.stringify 返回一个 JSON 字符串并包含 "

目前,您的模板可能如下所示:

<button onclick="myGreatFunction({{{json this}}})"></button>

编译:

<button onclick="myGreatFunction({"foo":"bar"})"></button>
                ^                 ^   ^ ^   ^  ^

这个结果为

Uncaught SyntaxError: missing ) after argument list


你需要逃避那些",你可以在你的助手中做到这一点

Handlebars.registerHelper('json', function(context) {
    return JSON.stringify(context).replace(/"/g, '&quot;');
});

这将导致

<button onclick="myGreatFunction({&quot;foo&quot;:&quot;bar&quot;})"></button>

【讨论】:

  • 谢谢!更改了帮助程序,但写入文档的 JSON 看起来仍然错误,并且按钮在单击时消失。
  • 更新您的答案以提及myGreatFunction({{{json this}}}),因为其他人可能和我一样慢(或没有,但只是为了确定)。谢谢!返回到文档的 HTML 现在是正确的,但按钮仍然只是消失了,但可能是其他原因造成的。
  • 愚蠢的是,我将函数命名为remove,这当然删除了点击按钮。现在一切正常,非常感谢!
【解决方案2】:

只需取出多余的支架。如果您让 Handlebars 进行 HTML 转义(它会在常规的 {{json this}} 调用中自动转义),它也会为您转义引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多