Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 部分刷新触发两次的问题_Javascript_Jsf_Xpages - Fatal编程技术网

Javascript 部分刷新触发两次的问题

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.

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

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

    <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。

我想我必须想出一个不同的解决方案,比如触发一个服务器端事件进行计算,然后在完成后刷新数据表。我想我必须想出一个不同的解决方案,比如触发一个服务器端事件进行计算完成后,刷新数据表。