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