Meteor如何在mongo中保存模板

时间:2014-07-17 15:29:03

标签: meteor meteor-blaze

我想让我的用户可以创建文档模板(合同,电子邮件等)

我想出的最佳选择是将这些文档模板存储在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呈现模板但没有数据上下文...

4 个答案:

答案 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

我对现实编程相当陌生,所以我的代码可能很难看,但可能会给你一些解决问题的指示。 (如果你发现我在那里做了一些愚蠢的事情,或者看到其他方式做得更好的话,请随时发表评论。这是我获得改进反馈的唯一方式,因为我是新人,而且基本上是代码独自坐在我身边黑暗的角落)。