0

我还有一个大问题。我有组件,带区域和刷新区域的表单。当我将组件放入循环时,它只显示最后一个区域。我为每个区域生成了唯一 ID。在页面源代码中,我可以看到每个区域都获得了正确的 ID,但在提交时它没有返回正确的 ID。反正有没有按ID返回区域?

这是我的代码:

<details>      
    <summary>Comments</summary><br />        
      <t:zone t:id="commentZone" id="prop:zoneId">                
                <t:commentlist materijalID="materijalID"></t:commentlist><br />  
    </t:zone>                
    <t:form t:id="komentar" t:context="materijalID" t:zone="prop:zoneId">
            <t:textarea t:value="comment" rows="6" cols="40"></t:textarea><br />
             <input type="submit" value="Add comment"/>
    </t:form>
</details>
public class Comments 
{   
    @Parameter(required=true) 
    @Property 
    private int materijalID; 

    @SessionState 
    @Property 
    private User user; 

    @Inject 
    private Session session; 

    @Property 
    private String comment; 

    @InjectComponent 
    private Zone commentZone; 


    @CommitAfter 
    public Object onSuccessFromKomentar(int materijalID) 
    {
        Komentar k = new Komentar(); 
        Date d = new Date(); 
        Materijal m = (Materijal)session
                .createCriteria(Materijal.class)
                .add(Restrictions.eq("materijalID", materijalID))
                .list()
                .get(0); 
        k.setMaterijal(m); 
        k.setKorisnikID(this.user.getID()); 
        k.setDatumUnosa(d); 
        k.setDatumModifikacije(d); 
        k.setKomentar(this.comment); 
        session.save(k); 
        this.comment = ""; 
        return this.commentZone.getBody(); 
    }

    public String getZoneId() 
    { 
        return "Zone_" + this.materijalID; 
    } 
} 

提前致谢

4

2 回答 2

1

您是否尝试过t:defer="false"在 中设置Submit

亨宁在这里回答了一个类似的问题

于 2012-12-11T19:57:28.253 回答
0

问题很可能是您传递给commentList 的材料ID 与作为@Parameter 传递的相同。这意味着您的封装组件将为您设置此值。在你的循环的情况下,这很可能总是在你的渲染阶段之后的最后一个。

解决方案在于解耦这个通道。类似于以下内容:

<details>      
    <summary>Comments</summary><br />        
    <t:zone t:id="commentZone" id="prop:zoneId">                
        <t:commentlist materijalID="prop:passThroughMaterijalID"></t:commentlist>
        <br />  
    </t:zone>                
    <t:form t:id="komentar" t:context="materijalID" t:zone="prop:zoneId">
        <t:textarea t:value="comment" rows="6" cols="40"></t:textarea><br />
        <input type="submit" value="Add comment"/>
    </t:form>
</details>
public class Comments 
{   
    @Parameter(required=true) 
    @Property 
    private int materijalID; 

    @Property 
    private int passThroughMaterijalID; 

    @SessionState 
    @Property 
    private User user; 

    @Inject 
    private Session session; 

    @Property 
    private String comment; 

    @InjectComponent 
    private Zone commentZone; 

    @SetupRender
    private void setup() {
        this.passThroughMaterijalID = materijalID;
    }


    @CommitAfter 
    public Object onSuccessFromKomentar(int materijalID) 
    {   
        this.passThroughMaterijalID = materijalID;
        Komentar k = new Komentar(); 
        Date d = new Date(); 
        Materijal m = (Materijal)session
                .createCriteria(Materijal.class)
                .add(Restrictions.eq("materijalID", materijalID))
                .list()
                .get(0); 
        k.setMaterijal(m); 
        k.setKorisnikID(this.user.getID()); 
        k.setDatumUnosa(d); 
        k.setDatumModifikacije(d); 
        k.setKomentar(this.comment); 
        session.save(k); 
        this.comment = ""; 
        return this.commentZone.getBody(); 
    } 

    public String getZoneId() 
    { 
            return "Zone_" + this.materijalID; 
    } 
} 
于 2012-12-05T12:42:38.937 回答