Javascript 部分刷新触发两次的问题
我有一个dojo按钮栏,它绑定到csjs函数。此函数对数据表控件执行partialrefreshget()。datatable控件包含一个视图作为其数据源 在this.keys属性中,我定义了一些逻辑,以查看partialrefresh是否是通过检查context.getSubmittedValue()触发的。在试验这种技术时,我注意到下面的代码被触发了两次Javascript 部分刷新触发两次的问题,javascript,jsf,xpages,Javascript,Jsf,Xpages,我有一个dojo按钮栏,它绑定到csjs函数。此函数对数据表控件执行partialrefreshget()。datatable控件包含一个视图作为其数据源 在this.keys属性中,我定义了一些逻辑,以查看partialrefresh是否是通过检查context.getSubmittedValue()触发的。在试验这种技术时,我注意到下面的代码被触发了两次 <xp:this.keys><![CDATA[#{javascript: var vec = new java.
<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语句被打印两次到控制台,因此逻辑被触发两次。有人能给我解释一下为什么会这样,我能做些什么吗?我应该在其他地方或其他地方检查提交的值吗 我认为如果您实现一个阶段侦听器来打印每个阶段步骤,您将看到this.keys在生命周期中被评估两次。可能在渲染响应期间一次,另一次在恢复视图或其他过程中。我会避免将应用程序逻辑放在属性计算中,因为它可能会在您认为不应该触发的时候触发,除非您非常熟悉应用程序生命周期。我认为,如果您实现一个阶段侦听器来打印出每个阶段步骤,您将看到此.keys在生命周期中会被计算两次。可能在渲染响应期间一次,另一次在恢复视图或其他过程中。我会避免将应用程序逻辑放在属性计算中,因为它可能会在您认为不应该触发的时候触发,除非您非常熟悉应用程序的生命周期。我实际上在一些控件上看到提交两到三次。我听说这是JSP引擎中一个尚未解决的异常问题
我要做的是在计算完vec后将其写入请求范围变量。然后在计算获取请求范围变量之前添加逻辑,如果它存在,则返回它,而不是重新计算值。我实际上在一些控件上看到提交两到三次。我听说这是JSP引擎中一个尚未解决的异常问题
我要做的是在计算完vec后将其写入请求范围变量。然后在计算获取请求范围变量之前添加逻辑,如果它存在,则返回它,而不是重新计算值。经过一点测试后,我放弃调用自己的partialrefreshget方法。extlib dojo工具栏包含一个onclick事件,当在节点上设置submitvalue时会触发该事件。在这个onclik事件中,我添加了如下代码
Var v = context.getsubmittedvaleu();
If("action".equals(v)){
// do stuff that changes the dataset..
}
事件处理程序设置为部分刷新接收新数据的datatable。这是一个比在数据源中检查submittedvalue更干净的实现(如jeremy hodge所述)
这样,数据源只刷新一次
作为旁注,我想补充一点,将这样的事件直接添加到treenode中会很好在标准java swing/awt dev中,我会向按钮添加controllistener。经过一点测试后,我放弃调用自己的partialrefreshget方法。extlib dojo工具栏包含一个onclick事件,该事件在节点上设置submitvalue时触发。在这个onclik事件中,我添加了如下代码
Var v = context.getsubmittedvaleu();
If("action".equals(v)){
// do stuff that changes the dataset..
}
事件处理程序被设置为部分刷新接收新数据的数据表。这是一个比在数据源中检查submittedvalue更干净的实现(如jeremy hodge所述)
这样,数据源只刷新一次
作为旁注,我想补充一点,将这样的事件直接添加到treenode中会很好正如我在标准java swing/awt dev中所做的那样,我会在按钮上添加一个controllistener。我想我必须想出一个不同的解决方案,比如触发一个服务器端事件进行计算,然后在完成后刷新数据表。我想我必须想出一个不同的解决方案,比如触发一个服务器端事件进行计算完成后,刷新数据表。