3

配列が空でない場合、StringTemplate を使用して確認する方法は?

以下の例は機能しません。

<if(teams.length > 0)>
  <ul>
    <teams:{team | <li><team></li> }>
  </ul>
<endif>

その他 (機能していない) 例:

String content = "<if(teams)>list: <teams;separator=\", \"><endif>";
ST template = new ST(content);
template.add("teams", new Long[]{123L, 124L});

System.out.println(template.render());

System.out.println("--------");

content = "<if(teams)>list: <teams;separator=\", \"><endif>";
template = new ST(content);
template.add("teams", new Long[]{});

System.out.println(template.render());

出力:

list: 123, 124
--------
list: 
4

1 に答える 1

5

使用するだけです:

<if(teams)>

teamsリストが空の場合、この条件は false と評価されます。StringTemplateのドキュメントから:

条件式は、属性の有無をテストします。モデルとビューを厳密に分離するには、式で name=="parrt" などの属性値をテストできないようにする必要があります。属性を設定しないか、NULL 値の属性を渡さない場合、その属性は false と評価されます。StringTemplate は、空のリストとマップ、および長さ 0 のリストなどの「空の」反復子に対しても false を返します (Interpreter.testAttributeTrue() を参照)。Boolean オブジェクトを除いて、他のすべての属性は true と評価されます。Boolean オブジェクトは、そのオブジェクト値に評価されます。厳密に言えば、これは分離違反ですが、Boolean の false オブジェクトが null ではないという理由だけで true と評価されるのは奇妙すぎます。

例:

String content = "1: <if(teams)>list: <teams;separator=\", \"><endif>";
ST template = new ST(content);

// Create a list with two items
List<Long> teams = new ArrayList<Long>();
teams.add(123L);
teams.add(124L);

template.add("teams", teams);

System.out.println(template.render());

// Add separator
System.out.println("--------");

content = "2: <if(teams)>list: <teams;separator=\", \"><endif>";
template = new ST(content);

// Create empty list
teams = new ArrayList<Long>();
template.add("teams", teams);

System.out.println(template.render());

出力:

1: list: 123, 124
--------
2: 
于 2014-03-28T17:03:06.860 に答える