3

我刚刚开始使用 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: ...' 异常。

我假设我可以使用将 options 参数传递给调用模板的变通方法,但是我需要确保涵盖所有进入模板的方法,这将变得非常乏味。

此刻我想我必须和

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

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

有没有更好的办法?

4

2 回答 2

4

As of the Sept 19, 2011 release, Closure Templates provides support for list and map literals. Unfortunately, there is a small bug with list and map literals in the release, which is partially fixed in plovr, but an official fix should be coming soon, which will be integrated into plovr once it is available.

于 2011-10-10T17:40:11.940 回答
3

不幸的是,不,闭包模板不支持文字列表或映射值,尽管您可以利用 plovr 来解决您的问题(见下文)。就在 Soy 模板中构造值而言,您会受到 Closure Templates 文档的Expressions部分中可以表达的内容的限制。

遗憾的是,根据 Closure Templates 的维护者 Kai Huang 的说法, map 和 list 字面量在优先级列表上似乎不够高。

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

请注意,如果您想在list()plovr 之外使用函数插件,则必须按照 Closure Templates 文档中的说明使用函数ListFunction.java插件。

于 2011-07-06T04:35:34.880 回答