JSF2 - f:ajax元素的范围是什么?

时间:2010-03-23 19:06:59

标签: ajax jsf-2

我有这样的表格:

<h:form>
    <h:outputText value="Tag:" />   
    <h:inputText value="#{entryRecorder.tag}">
        <f:ajax render="category" />
    </h:inputText>
    <h:outputText value="Category:" />
    <h:inputText value="#{entryRecorder.category}" id="category" />
</h:form>

我想要实现的目标:当您在“标记”字段中输入内容时,entryRecorder.tag字段会根据输入的内容进行更新。根据此操作的一些逻辑,bean还会更新其category字段。这种变化应该反映在表格中。

问题:

  1. EntryRecorder我应该使用什么范围?对于多个AJAX请求,请求可能不会令人满意,而会话将无法在每个会话中使用多个浏览器窗口。
  2. 如何在updateCategory()中注册我的EntryRecorder操作,以便在更新bean时触发它?

2 个答案:

答案 0 :(得分:0)

回答第2点:

<h:inputText styleClass="id_tag" value="#{entryRecorder.tag}"
    valueChangeListener="#{entryRecorder.tagUpdated}">
    <f:ajax render="category" event="blur" />
</h:inputText>

豆:

@ManagedBean
@ViewScoped
public class EntryRecorder {
    private String tag;
    private String category;
    @EJB
    private ExpenseService expenseService;

    public void tagUpdated(ValueChangeEvent e) {
        String value = (String) e.getNewValue();
        setCategory(expenseService.getCategory(value));
    }
}

1号,还有谁?

答案 1 :(得分:0)

要点1,我将使用Request,因为没有必要使用View和Session,正如你所指出的那样,完全没必要。

对于第2点,因为您正在使用&lt; f:ajax /&gt;我建议充分利用它。这是我的建议:

XHTML:

<h:form>
    <h:outputText value="Tag:" />
    <h:inputText value="#{entryRecorder.tag}">
        <f:ajax render="category" event="valueChange"/>
    </h:inputText>
    <h:outputText value="Category:" />
    <h:inputText value="#{entryRecorder.category}" id="category" />
</h:form>

请注意使用valueChange事件而不是模糊(不是模糊不起作用,但我发现valueChange更适合值保持器组件)。

豆:

@ManagedBean
@RequestScoped
public class EntryRecorder {
    private String tag;
    private String category;

    public String getCategory() {
        return category;
    }

    public String getTag() {
        return tag;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public void setTag(String tag) {
        this.tag = tag;
        tagUpdated();
    }

    private void tagUpdated() {
        category = tag;
    }
}

除非您真的希望tagUpdated方法仅在通过视图更新标记时执行,否则我的提案看起来更清晰。您不必处理事件(也不需要强制转换),并且tagUpdated方法可以隐藏它的功能,使其免于可能的滥用。