部分刷新问题触发两次

时间:2012-03-07 20:40:25

标签: javascript jsf xpages

我有一个dojo按钮栏,它绑定到csjs函数。此函数对可控数据控件执行partialrefreshget()。数据表控件包含一个视图作为其数据源。

在this.keys属性中,我已经定义了一些逻辑,以查看是否通过检查context.getSubmittedValue()来触发partialrefresh。在尝试这种技术时,我注意到以下代码被触发了两次。

    <xp:this.keys><![CDATA[#{javascript:
var vec = new java.util.Vector()
vec.add("category");


if(context.getSubmittedValue()!=null){
    var x = context.getSubmittedValue().trim();

    print("--")
}

return vec;}]]></xp:this.keys>

将print语句打印两次到控制台,因此逻辑被触发两次。有人可以向我解释为什么会发生这种情况以及我能做些什么呢?我应该检查其他地方提交的值还是?

3 个答案:

答案 0 :(得分:2)

我认为如果你实现一个阶段监听器来打印出每个阶段的步骤,你会发现在LifeCycle期间会对this.keys进行两次评估。可能在渲染响应期间一次,另一次在还原视图期间。我会避免将应用程序逻辑放在属性计算中,因为除非您非常关注应用程序生命周期,否则它可能会被触发,除非您非常关注应用程序生命周期。

答案 1 :(得分:1)

我实际上在某些控件上看到提交两到三次。我听说它是​​JSP引擎中的一个异常,尚未解决。

我所做的是在计算后将vec写入请求范围变量。然后在计算它之前添加逻辑以获取请求范围变量,如果它存在,则返回它而不是重新计算该值。

答案 2 :(得分:1)

经过一些测试后,我放弃了调用自己的partialrefreshget方法.extlib dojo工具栏包含一个onclick事件,该事件在设置了submitvalue的节点上触发。在这个onclik事件中,我添加了像

这样的代码
Var v = context.getsubmittedvaleu();

If("action".equals(v)){
  // do stuff that changes the dataset.. 
}

事件处理程序设置为部分刷新接收新数据的数据表。这比检查数据源中的提交值要清晰得多(如(jeremy hodge)所述。

这样,数据源只刷新一次。


作为旁注,我想补充一点,将这样的事件直接添加到treenode会很好,就像在标准的java swing / awt dev中一样,通过向按钮添加一个controllistener。