2014-02-20 4 views
2

данных следующие фрагменты кода:Доступ к свойствам в шаблонах по имени

заводного:

binding = [key1: "val1"] 
def f = new File('test.template') 
engine = new GStringTemplateEngine() 
template = engine.createTemplate(f).make(binding) 
println template.toString() 

test.template:

<% keyName = "key1" %> 

Есть ли способ получить доступ к val1 по KEYNAME в test.template?

Это:

${ binding[keyName] } 

не работает (Нет такого свойства: key1 для класса: groovy.lang.Binding). Есть идеи? Может быть, имя карты, содержащей свойства, отличается?

Я знаю, что я мог бы просто написать:

${ key1 } 

, но мне нужно, чтобы получить доступ к собственности key1 с помощью переменной KEYNAME.

+0

Я прочитал код Groovy и нашел способ: используйте $ {delegate [keyName]}. Делегат - это частное поле Closeure, поэтому я думаю, что должно быть более элегантное решение моей проблемы. Все еще ищут ответ. – user3334236

+0

Похоже, это добавляет дополнительный уровень косвенности. Для начала подумайте, что вам нужно будет добавить keyName: 'key1' на вашу карту привязки, но мне не удалось заставить шаблон работать, выполнив это ... – mikemil

+0

'delegate. '$ KeyName" 'или' delegate [ keyName] 'путь вперед –

ответ

0

Не уверен, что это лучше, но я получил следующие работы (несколько)

Map binding = [ keyName: 'key1', key1: "val1", m: [key1:'val100', key2:'val2']] 
def f = new File('test.template') 
def engine = new groovy.text.GStringTemplateEngine() 
def template = engine.createTemplate(f).make(binding) 
println template.toString() 

со следующим шаблоном:

$keyName 
$key1 
<%= m[keyName] %> 

Но это зависит от подотображения, который содержит значение, ищем.

Я вижу сценарии, где в привязке вы передаете список полей, которые хотите обработать или отобразить (вместо того, чтобы знать их заранее), поэтому вам нужно будет получить имена полей из хорошо известной переменной а затем обрабатывать другие, возможно, через подмап.

Смежные вопросы