グリッドのコードのコードを 2 回複製することなく、まったく同じ機能を実行する 2 つのグリッドを作成しようとしています。そこで、マクロコンポーネントを使用することにしました。しかし、マクロ コンポーネントでコンポーネントの ID を動的に作成する方法がわかりません。コードは次のことを行います。
最初のグリッド (西の領域) には、2 つのテキスト ボックスを持つ 2 つの行があります。このグリッドの最初のテキスト ボックスに「hello」を追加すると、2 番目のテキスト ボックスの値も「hello」に設定されます。
2 番目のグリッド (中央の領域) には、2 つのテキスト ボックスを持つ 2 つの行があります。このグリッドの最初のテキスト ボックスに「world」を追加すると、2 番目のテキスト ボックスの値も「world」に設定されます。
- 最初のグリッドの両方のテキスト ボックスの値が同じになりました。つまり、「hello」です。
 - 2 番目のグリッドの両方のテキスト ボックスの値は同じになりました。つまり、"world" です。
 
次のようなマクロ コンポーネントを使用する zul ファイルを作成しました。
<?component name="mygrid1" macro-uri="grid1.zul" inline="true"?>
<zk>
<vbox hflex="1">
  <borderlayout height="500px" width="500px">
    <west size="50%">
      <mygrid1 id="grid1" index="1" />
    </west>
    <center>
      <mygrid1 id="grid2" index="2" />
    </center>
  </borderlayout>
</vbox>
</zk>
<zscript>
  fillInDuplicateBox(String value, Textbox duplicateBox) {
    if (!"".contentEquals(duplicateBox.value))
            return;
    duplicateBox.value = value;
  }
</zscript>
</window>
マクロ コンポーネントを以下に示します。
<zk>
<vbox hflex="1">
  <grid width="300px">
    <rows>
      <row> Box 1: <textbox id="${concat("newBox", arg.index)}" onChange="fillInDuplicateBox(${concat("newBox, arg.index)}.value, ${concat("duplicateBox", arg.index)})" hflex="1" /></row>
      <row> Box 2: <textbox id="${concat("duplicateBox", arg.index)}" hflex="1" /></row>
    </rows>
  </grid>                   
</vbox>
</zk>
マクロコンポーネントを作成するために次のコードも試しました
<zk>
  <vbox hflex="1">
    <grid width="300px">
      <rows>
         <row> Box 1: <textbox id="newBox${arg.index}" onChange="fillInDuplicateBox(newBox${arg.index}.value, duplicateBox${arg.index})" hflex="1" /></row>
         <row> Box 2: <textbox id="duplicateBox${arg.index}" hflex="1" /></row>
      </rows>
    </grid> 
  </vbox>
</zk>
これはどれも機能しません。マクロ コンポーネントでコンポーネントの ID を動的に作成する方法がわかりません。最初のグリッドのテキストボックス ID は「newBox1」、「duplicateBox1」である必要があり、2 番目のグリッドのテキストボックス ID は「newBox2」、「duplicateBox2」である必要があります。
このタスクを達成するためのより良い方法があるかどうかを指摘してください。
ありがとう、ソニー