2016-03-21 74 views
1

假设我在pebble或freemarker(我正在考虑使用的两个引擎)中都有一个模板。它可能是这个样子:对Pebble/Freemarker变量/插值的懒惰评估

<Node> 
    <Element attribute="{{ VAR_A }}"/> 
    <Element attribute="{{ VAR_F }}"/> 
    <Element attribute="{{ VAR_N }}"/> 
</Node> 

在我的Java代码,我将需要提供包含这些变量的,我相信可以只是地图变量名的两个引擎对象的对象。

但是为了生成数据模型,我需要知道要为哪些变量计算值。我有很多数据。我不想计算所有的VAR_A,VAR_B,VAR_C,VAR_D,VAR_E等,如果他们不会被使用。

在执行模板之前,在这些引擎中是否有一种方法可以获取所需变量的列表?一种方法来做每个属性值的延迟评估

编辑:我不知道当我必须评估它,因为它将由用户定义模板将看起来像。即使他们提供的变量将是用户定义的字符串 - 这就是为什么我需要(并分析)他们,然后才能提供数据。

+0

你问你的模型是否可以做属性值的懒惰评估? – Raedwald

+0

基本上,是的。 – AdamBourke

回答

0

您使用Freemarker生成的每种文档都有自己的模板。每个模板都会有一个设置,如果它使用了变量。在您的Java代码中,您提供了一个将变量名称映射到值的Map。如果您有与每个模板对应的不同Java方法,那么这些方法可以为该模板设置最小的所需映射。那张地图不一定是HashMap;理论上你可以编写你自己的Map接口的实现,它在其getvalues(etc)方法中做了懒惰评估。但这几乎肯定比它的价值更麻烦。您提供的地图中的值不需要是String对象; Freemarker将使用每个对象的toString方法,这提供了一种懒惰的评估。

+0

在这种情况下,我不会事先知道模板的样子,并且每个用户可能会有所不同。模板中的变量将由用户定义,因此无论如何我需要查看它们中的每一个。如果需要,我可以重写HashMap - 但我希望有一种方法可以预先评估模板以获取变量列表。 – AdamBourke

+0

这没有任何意义。如果tempkates是用户定义的,则用户正在对系统进行编程,而不是您。你不想这样做。 – Raedwald

+0

该软件为用户提供了大量的自定义功能。这个想法是,他们可以编写自己的模板,我们将在系统中填充数据。他们使用的变量将在系统中的其他地方定义。这是我们想要做的。 – AdamBourke