Return html 来自车把助手的对象
Return html object from handlebars helpers
我需要从 handlebars helper 发送一个 html 对象,如下所示:
Handlebars.registerHelper('helper', function () {
//Create an input object
var inp=$('<input type="text" name="name">');
//How to return 'inp' object without using Handlebars.SafeString
return inp;
});
我知道我可以 return html 使用 'Handlebars.SafeString()' 的字符串,但这对我没有用我需要传递 html 对象一些事件分配给它。
可能吗?
正如 dandavis 评论的那样,使用 Handlebars 你不能模板化 objects,只能使用字符串。但是,您可以在使用 MutationObserver 将元素添加到 DOM 之后获取元素。我已经创建了一些帮助程序来执行此操作,请参阅 post-render-bars. See also this answer 中的 jq
帮助程序以了解不同方法的类似问题。
这是 post-render-bars 的 demo,请查看标题 "Define a jQuery element in a template" 下的示例。
如果需要,助手使用 MutationObserver, here's browser support info, see webcomponents-lite 作为 polyfill。
相关代码的简要说明:
watch.js 定义了一个函数 forHtml(html, callback)
,当在 DOM 中遇到给定的 html 时触发回调。它修改 html 以暂时具有使其独一无二的 class。
jQueryHelpers.js 定义助手 jq
。助手使用 watch.forHtml
函数来监视由助手定义的块,并使用 jquery 元素作为参数调用您传递给模板的函数。
这是我链接的示例的简化版本,模板:
<p>button with a handler: {{#jq setHandler}}<button>try me</button>{{/jq}}</p>
和 js:
var context = {
setHandler: function(element) {
element.on('click', function() {
alert('clicked');
});
}
};
var html = template(context);
// append html somewhere and the setHandler will be invoked
存在一个名为 DOMBars 的 fork/extension 车把,正是考虑到了这种功能。
https://github.com/blakeembrey/dombars
它已被作者弃用,但它仍然可用,但您可能会记住,使用已弃用的库可能会在未来出现无法预料的问题。
它的工作原理与 Handlebars 完全一样,除了辅助函数还可以 return DOM 个元素。
您的模板:
<script id="template">
<p>Something {{{ helper data }}}</p>
</script>
代码:
Handlebars.registerHelper('helper', function (text) {
// Create an input jQuery Object and bind whatever callbacks you want to it.
var inp = $('<input type="text" name="name">' + text '</input>');
// Return the DOM Object
return inp.get(0);
});
template = DOMBars.compile($('#template').html())
const html = template({ data: "Something" })
我需要从 handlebars helper 发送一个 html 对象,如下所示:
Handlebars.registerHelper('helper', function () {
//Create an input object
var inp=$('<input type="text" name="name">');
//How to return 'inp' object without using Handlebars.SafeString
return inp;
});
我知道我可以 return html 使用 'Handlebars.SafeString()' 的字符串,但这对我没有用我需要传递 html 对象一些事件分配给它。
可能吗?
正如 dandavis 评论的那样,使用 Handlebars 你不能模板化 objects,只能使用字符串。但是,您可以在使用 MutationObserver 将元素添加到 DOM 之后获取元素。我已经创建了一些帮助程序来执行此操作,请参阅 post-render-bars. See also this answer 中的 jq
帮助程序以了解不同方法的类似问题。
这是 post-render-bars 的 demo,请查看标题 "Define a jQuery element in a template" 下的示例。
如果需要,助手使用 MutationObserver, here's browser support info, see webcomponents-lite 作为 polyfill。
相关代码的简要说明:
watch.js 定义了一个函数 forHtml(html, callback)
,当在 DOM 中遇到给定的 html 时触发回调。它修改 html 以暂时具有使其独一无二的 class。
jQueryHelpers.js 定义助手 jq
。助手使用 watch.forHtml
函数来监视由助手定义的块,并使用 jquery 元素作为参数调用您传递给模板的函数。
这是我链接的示例的简化版本,模板:
<p>button with a handler: {{#jq setHandler}}<button>try me</button>{{/jq}}</p>
和 js:
var context = {
setHandler: function(element) {
element.on('click', function() {
alert('clicked');
});
}
};
var html = template(context);
// append html somewhere and the setHandler will be invoked
存在一个名为 DOMBars 的 fork/extension 车把,正是考虑到了这种功能。
https://github.com/blakeembrey/dombars
它已被作者弃用,但它仍然可用,但您可能会记住,使用已弃用的库可能会在未来出现无法预料的问题。
它的工作原理与 Handlebars 完全一样,除了辅助函数还可以 return DOM 个元素。
您的模板:
<script id="template">
<p>Something {{{ helper data }}}</p>
</script>
代码:
Handlebars.registerHelper('helper', function (text) {
// Create an input jQuery Object and bind whatever callbacks you want to it.
var inp = $('<input type="text" name="name">' + text '</input>');
// Return the DOM Object
return inp.get(0);
});
template = DOMBars.compile($('#template').html())
const html = template({ data: "Something" })