3

我想让我的用户能够创建文档模板(合同、电子邮件等)

我想出的最佳选择是将这些文档模板存储在 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

4 回答 4

1

您缺少的是对(未记录!)的调用,Template.__define__它需要模板名称(选择一些独特而聪明的东西)作为第一个参数和您从空格键编译器获得的渲染函数。完成后,您可以{{> UI.dynamic}}按照@Slava 的建议使用。

还有另一种方法可以做到这一点,通过使用UI.ComponentAPI,但我想它目前非常不稳定,所以也许我会跳过这个,至少现在是这样。

于 2014-07-18T14:06:14.523 回答
0

使用 UI.dynamic:https ://www.discovermeteor.com/blog/blaze-dynamic-template-includes/

它是相当新的,并且由于某种原因没有进入文档。

于 2014-07-17T17:26:25.737 回答
0

有几种方法可以实现你想要的,但我会这样做:

你可能已经在使用underscore.js,如果不是 Meteor 有它的核心包。

您可以像这样使用下划线模板 ( http://underscorejs.org/#template ):

var templateString = 'Dear <%= firstname %>'

然后使用

_.template(templateString, {firstname: "Tom"})

得到Dear Tom.

当然你可以templateString同时存储在 MongoDB 中。
您可以将分隔符设置为您想要的任何内容,<%= %>这只是默认设置。

于 2014-07-18T13:52:41.287 回答
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);

虽然我渲染模板客户端的用例有些不同(我的任务是实时更新更改的模板,覆盖流星的热代码推送),但这在渲染模板的不同方法中效果最好。

你可以在这里查看我非常早期的包:https ://github.com/channikhabra/meteor-live-update/blob/master/js/live-update.js

我对现实世界的编程相当陌生,所以我的代码可能很难看,但它可能会给你一些解决问题的建议。(如果你发现我在那里做了一些愚蠢的事情,或者看到一些更好的方法,请随时发表评论。这是我获得改进反馈的唯一方式,因为我是新手,基本上只有代码坐在我的暗角)。

于 2014-07-19T17:09:01.710 回答