是否可以在Closure模板中创建对象?

时间:2011-07-06 03:50:07

标签: google-closure plovr google-closure-templates

我刚刚开始使用Google Closure进行一些工作,我想将选择字段的创建移动到自己的模板中,然后用以下内容调用该模板:

{call templates.utils.select}
  {param name: 'state'/}
  {param value: $selected_state /}
  {{param options: [
    {name: 'Australian Capital Territory', value: 'ACT'},
    {name: 'New South Wales', value: 'NSW'},
    {name: 'Northern Territory', value: 'NT'},
    {name: 'Queensland', value: 'QLD'},
    {name: 'South Australia', value: 'SA'},
    {name: 'Tasmania', value: 'TAS'},
    {name: 'Victoria', value: 'VIC'},
    {name: 'Western Australia', value: 'WA'}
  ]/}}
{/call}

并且templates.utils.select模板将具有为正确选项设置selected属性的逻辑。不幸的是我收到了'并非所有代码都在Soy V2语法中(找到了标签{{param options:[{name:...'exception。

我假设我可以使用将参数参数传递给调用模板的解决方法,但是我需要确保覆盖进入模板的所有方法,这将变得非常繁琐。 / p>

目前我认为我必须选择

<select name="state">
  <option value="ACT" {if $selected_state=='ACT'}selected="selected"{/if}>Australian Capital Territory'</option>
  <option value="NSW" {if $selected_state='NSW'}selected="selected"{/if}>New South Wales</option>
  ...
</select>

这也很乏味,但至少数据只在一个地方。

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

截至Sept 19, 2011 release, Closure Templates provides support for list and map literals。遗憾的是,发布版本中有一个列表和地图文字的小错误,partially fixed in plovr,但很快就会出现官方修复,一旦可用,它将被整合到plovr中。

答案 1 :(得分:3)

不幸的是,不,Closure模板不支持文字列表或地图值,但您可以利用plovr来解决您的问题(见下文)。就在Soy模板中构造值而言,您受限于可以在Closure Templates文档的Expressions部分中表达的内容。

可悲的是,听起来好像地图和列表文字在优先级列表according to the maintainer of Closure Templates, Kai Huang上足够高。

虽然如果你使用的是plovr,那么你可能想要利用soy-function-plugins选项,这样当list()函数插件是org.plovr.soy.function.PlovrModule时,可以通过自定义list()函数使用列表。用过的。 Javadoc for ListFunction显示了如何在闭包模板中使用list()函数的示例。

请注意,如果您想在plovr之外使用ListFunction.java函数插件,则必须将{{1}}与function plugins as described in the Closure Templates documentation一起使用。