我想让我的用户可以创建文档模板(合同,电子邮件等)
我想出的最佳选择是将这些文档模板存储在mongo中(也许我错了......)
我现在已经搜索了几个小时,但我无法弄清楚如何使用他们的数据上下文来呈现这些文档模板。
示例:
Template stored in Mongo: "Dear {{firstname}}"
data context: {firstname: "Tom"}
在汤姆的网站上,他应该读到:“亲爱的汤姆”
我该怎么做?
编辑
经过一些研究,我发现了一个名为spacebars-compiler的包,它带来了编译到客户端的选项:
meteor add spacebars-compiler
然后我尝试了这样的事情:
Template.doctypesList.rendered = ->
content = "<div>" + this.data.content + "</div>"
template = Spacebars.compile content
rendered = UI.dynamic(template,{name:"nicolas"})
UI.insert(rendered, $(this).closest(".widget-body"))
但它不起作用。
模板被编译但后来,我不知道如何用它的数据上下文解释它并将其发送回网页。
编辑2
感谢汤姆,我越来越近了。
这就是我所做的:
Template.doctypesList.rendered = ->
content = this.data.content
console.log content
templateName = "template_#{this.data._id}"
Template.__define__(templateName, () -> content)
rendered = UI.renderWithData(eval("Template.#{templateName}"),{name:"nicolas"})
UI.insert(rendered, $("#content_" + this.data._id).get(0))
除了名称未注入模板外,这项工作除外。 UI.renderWithData呈现模板但没有数据上下文...
答案 0 :(得分:1)
你缺少的是调用(未记录的!)Template.__define__
,它需要模板名称(选择一些独特而聪明的东西)作为第一个参数和你从空格键编译器获得的渲染函数。完成后,您可以使用{{> UI.dynamic}}
作为@Slava建议。
使用UI.Component
API还有另一种方法可以做到这一点,但我认为目前它非常不稳定,所以也许我会跳过这个,至少目前是这样。
答案 1 :(得分:0)
使用UI.dynamic:https://www.discovermeteor.com/blog/blaze-dynamic-template-includes/
这是相当新的,并且由于某种原因没有进入文档。
答案 2 :(得分:0)
实现你想要的东西的方法很少,但我会这样做:
你可能已经在使用underscore.js了,如果不是Meteor有核心包。
您可以使用下划线模板(http://underscorejs.org/#template),如下所示:
var templateString = 'Dear <%= firstname %>'
然后使用
编译它 _.template(templateString, {firstname: "Tom"})
获取Dear Tom
。
当然,您可以在此期间将templateString
存储在MongoDB中
您可以将分隔符设置为您想要的任何内容,<%= %>
只是默认值。
答案 3 :(得分:0)
编译模板本质上是Meteor使用的htmljs表示法(或者我认为),它使用Template.template_name.lookup
来呈现正确的数据。如果Template.template_name.lookup("data_helper")()
返回正确的数据,请检入控制台。
我最近不得不解决编译模板客户端这个确切(或类似)的问题。你需要确保事情的顺序是这样的:
Template.template_name.lookup("data_name")()
验证)要编译模板,正如@apendua建议的那样,使用(这是我使用它的方式,它对我有用)
Template.__define__(name, eval(Spacebars.compile(
newHtml, {
isTemplate: true,
sourceName: 'Template "' + name + '"'
}
)));
在此之后,您需要确保在页面上实际呈现模板之前,您要在模板中呈现的数据是可用的。这是我用于在页面上呈现模板的内容:
UI.DomRange.insert(UI.render(Template.template_name).dom, document.body);
虽然我的渲染模板客户端的用例有些不同(我的任务是实时更新改变模板覆盖meteor的热代码推送),但这在渲染模板的不同方法中效果最好。
您可以查看我的早期阶段包,其中执行此操作:https://github.com/channikhabra/meteor-live-update/blob/master/js/live-update.js
我对现实编程相当陌生,所以我的代码可能很难看,但可能会给你一些解决问题的指示。 (如果你发现我在那里做了一些愚蠢的事情,或者看到其他方式做得更好的话,请随时发表评论。这是我获得改进反馈的唯一方式,因为我是新人,而且基本上是代码独自坐在我身边黑暗的角落)。