3

在我的动作课中,我想要一个字符串映射。在我的 tml 中,我想使用文本字段访问此地图。就像是

<t:form>
    <t:textfield value="myMap['key1']"/>
    <t:textfield value="myMap['key2']"/>
...

我不坚持语法,但是目前挂毯中有这样的东西吗?如果没有,我需要以最简单的方式创建这样的转换吗?类型强制?自定义组件?我开始学习挂毯,所以请随意冗长:)

4

4 回答 4

6

另一种选择是绑定您自己的 tml 前缀。这里有一个绑定前缀的例子。

我们编写了自己的前缀,map它允许我们像这样获取 tml 中的值:

${map:myMap.key1}
于 2012-06-18T19:17:36.497 回答
3

好的,我想通了。我做了一个简单的组件 MapField:

@Parameter(required=true)
Map<String, String> map;

@Parameter(required=true, allowNull=false, defaultPrefix = BindingConstants.LITERAL)
String key;

public String getMapValue() {
    return map.get(key);
}

public void setMapValue(String value) {
    map.put(key, value);
}

tml:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
    <t:textfield value="mapValue"/>
</html>

就是这样。现在我们可以在其他 tml 中使用它:

<t:mapField key="existingOrNot" t:map="myMap"/>

在页面中,我们只需要myMap作为属性:

@Property @Persist Map<String, String> myMap;

可能还有更多事情要做,比如将所有额外的 html 参数传递给文本字段等

于 2012-05-22T20:41:40.880 回答
2

您将需要在您的 java 类中创建一个访问器方法。

最直接的方法是添加一个方法:

getMapValue(String key){...}

然后你可以改变你的 tml 来使用

value="getMapValue('key1')"

于 2012-05-20T23:11:34.207 回答
1

您应该能够像这样遍历密钥集:

<form t:type="Form">
    <t:Loop t:source="myMap.keySet()" t:value="currentKey"> 
        <input type="text" t:type="Textfield" t:value="currentValue"/>
    </t:Loop>
</form>

您必须在类文件中添加一些代码来存储当前映射键并提供对当前值的访问权限:

@Property
private Object currentKey;

@Persist
@Property
private Map<String,String> myMap;

public String getCurrentValue() {
     return this.myMap.get(this.currentKey);
}

public void setCurrentValue(final String currentValue) {   
    this.myMap.put(this.currentKey, currentValue);
}

(这个答案改编自我之前的一个答案。)

于 2012-05-22T11:15:00.587 回答