AJAX 请求后光标插入符号总是在变化

Cursor caret always changing after AJAX request

只要未输入页面上的所有输入字段,我就会尝试使 JSF 页面上的按钮保持禁用状态。

我尝试的第一件事是在按钮上使用部分触发器,在 "Disabled" 属性 上使用 EL 表达式,并在具有输入字段。为了完成这项工作,我还在所有输入字段上将 "AutoSubmit" 设置为 true。

<af:inputText label="First Name" id="fn_input" autoSubmit="true">
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:inputText label="Last Name" id="ln_input" autoSubmit="true">
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:button text="Submit" id="submit_btn" partialTriggers="fn_input ln_input" disabled="#{empty bindings.FirstName.inputValue or empty bindings.LastName.inputValue}"/>

这有效,但是,当两个输入字段都被填充时,只有当用户在字段外单击时(或通过按 Tab 键或单击其他地方将焦点移出字段),按钮才会启用。

所以我尝试的第二种方法是对输入字段的 "keyPress" 事件使用 ajax 调用,并刷新按钮。

<af:inputText label="First Name" id="fn_input" autoSubmit="true">
       <f:ajax render="submit_btn" event="keyPress" />
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:inputText label="Last Name" id="ln_input" autoSubmit="true">
       <f:ajax render="submit_btn" event="keyPress" />
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:button text="Submit" id="submit_btn" disabled="#{empty bindings.FirstName.inputValue or empty bindings.LastName.inputValue}"/>

使用上述方法实现了所需的功能,但是,每次用户在字段中键入一个字符时,光标都会回到字段的开头。

使用Chrome的检查工具,我跟踪了ajax调用,发现按钮和按钮都在刷新,从而导致光标插入符重置为单词的开头。

如何解决这个问题?

注:

提前致谢。

在 Oracle ADF 中,如果您想刷新组件及其所有属性,您需要在其父组件上添加 PPR。

在你的第一个案例中:

<af:panelFormLayout id="pfl1" partialTriggers="fn_input ln_input"> 
    <af:inputText label="First Name" id="fn_input" autoSubmit="true">
           <f:validator validatorId="NameValidator"/>
    </af:inputText>
    <af:inputText label="Last Name" id="ln_input" autoSubmit="true">
           <f:validator validatorId="NameValidator"/>
    </af:inputText>
    <af:button text="Submit" id="submit_btn" disabled="#{empty bindings.FirstName.inputValue or empty bindings.LastName.inputValue}"/>
</af:panelFormLayout>

回到这个问题 post 什么最终对我有用。 这是 12.2.1.3 版 ADF 的错误。升级到 12.2.1.4 后,光标插入符号停止返回输入的开头,但按钮仍将保持禁用状态。

将 ajax 事件从“keyPress”替换为“keyUp”就成功了。

<af:inputText label="First Name" id="fn_input" autoSubmit="true" value="#{bindings.FirstName.inputValue}">
       <f:ajax render="submit_btn" event="keyUp" />
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:inputText label="Last Name" id="ln_input" autoSubmit="true" value="#{bindings.LastName.inputValue}">
       <f:ajax render="submit_btn" event="keyUp" />
       <f:validator validatorId="NameValidator"/>
</af:inputText>
<af:button text="Submit" id="submit_btn" disabled="#{empty bindings.FirstName.inputValue or empty bindings.LastName.inputValue}"/>