0

我有一个包含输入文本和命令按钮对的 ui 重复。该按钮只是更改 inputtext 显示的值并重新呈现它。在第一个按钮上单击它会更改值但不会在屏幕上重新呈现。第二次单击执行相同但成功地重新呈现控件。Oneevent 触发所有 3 个状态事件就好了。日志中也没有显示任何内容。问题似乎在服务器端,但我使用的是 netbeans 7.3.1 中的默认面设置。

下面的代码将显示 4 行 inputValue 和按钮。第一个工作正常(它在 ui:repeat 之外。下面的 3 个都需要单击 2 次。

TestBean.java

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
    private MyObject nc;
    private List<MyObject> list;

    public TestBean() {
        nc = null;
        list = new ArrayList<MyObject>();
    }

    public MyObject getNc() {
        return nc;
    }

    public void setNc(MyObject nc) {
        this.nc = nc;
    }

    public List<MyObject> getList() {
        return list;
    }

    public void setList(List<MyObject> list) {
        this.list = list;
    }

    @PostConstruct
    public void onInit() {
        MyObject nc1 = new MyObject();
        nc1.setText("1");
        list.add(nc1);
        MyObject nc2 = new MyObject();
        nc2.setText("2");
        list.add(nc2);
        MyObject nc3 = new MyObject();
        nc3.setText("3");
        list.add(nc3);

        MyObject nc0 = new MyObject();
        nc0.setText("0");
        nc = nc0;
    }
}

MyObject.java

public class MyObject implements Serializable {
    public String text;

    public MyObject() {
        this.text = "";
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void testMethod() {
        text = "HEY";
    }
}

索引.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets<br />
        <h:form>
            <h:inputText id="text" readonly="true" value="#{testBean.nc.text}" />
                    <h:commandButton value="test">
                        <f:ajax listener="#{testBean.nc.testMethod()}" execute="text" render="text" />
                    </h:commandButton><br /><hr />

            <ui:repeat value="#{testBean.list}" var="cur">
                <h:panelGroup id="viewTest">
                    <h:inputText id="text" readonly="true" value="#{cur.text}" />
                </h:panelGroup>

                    <h:commandButton value="test">
                        <f:ajax listener="#{cur.testMethod()}" render="viewTest" immediate="true" />
                    </h:commandButton><br />

            </ui:repeat>
        </h:form>

    </h:body>
</html>
4

1 回答 1

0

我想到了。一旦我将 .testMethod() 更改为 .testMethod(AjaxBehaviorEvent ae) 它就可以在第一次点击时工作。显然,JSF 对它们的处理方式有所不同。希望别人能从我的错误中吸取教训。

于 2013-08-18T19:20:19.770 回答