JSF 1.2生命周期理解:在InvokeApplication阶段执行ValueChangeListener方法
我在DataTable的facet头中使用 。 该
DataTable的所有行内容都是
。 行按照我想要的方式完美选择。 以下是我使用的代码:
...... ...... ......
这是ValueChangeListener
的代码:
public void checkAll(ValueChangeEvent event){ if(isInvokeApplicationPhase(event)){ Iterator empl = employeeList.iterator(); while(empl.hasNext()){ Employee emp = empl.next(); emp.setChecked(checkedHdr); } } }
这是我为使这段代码工作而添加的isInvokeApplicationPhase
实用程序(在此链接中引用了BalusC
建议的解决方案: JSF 1.2:valueChangeListener事件未返回新选择的值 ):
public boolean isInvokeApplicationPhase(FacesEvent event){ if(event.getPhaseId() != PhaseId.INVOKE_APPLICATION){ event.setPhaseId(PhaseId.INVOKE_APPLICATION); event.queue(); return false; } return true; }
现在我的问题:
在ValueChangeListener
方法中使用isInvokeApplicationPhase
检查有什么用? 如果我评论这个检查然后它不起作用 – 为什么? 我以为我已经正确理解了JSF生命周期,但这种行为certificate我没有:(
请让我知道基于JSF生命周期阶段的解释。
值更改侦听器在validation阶段运行,并且意图挂钩值更改事件。 即新提交的值与原始模型值不同。
validation阶段在更新模型值阶段之前运行,其中JSF设置模型中的所有提交,转换和validation的值(支持bean的属性)。 因此,当您尝试更改值更改侦听器中的其他字段的模型值时,将在更新模型值阶段覆盖它。
此特定技巧将值更改事件重新排入调用应用程序阶段,该阶段在更新模型值阶段之后运行。 因此,当您尝试更改其他字段的模型值时,它将不会被覆盖。
简而言之:validation阶段只是手动操作模型值的错误时刻,而调用应用程序阶段是手动操作模型值的正确时刻。
实际上,价值变化事件在这里被滥用。 您应该在此处使用动作事件,但这不适用于JSF 1.x中的输入。 这只在JSF 2.x中以
风格提供。
也可以看看:
- 何时使用valueChangeListener或f:ajax监听器?
- Setter没有调用输入文本