xpages:动态更改数据源时,不会更新与字段的数据绑定
到目前为止,我已经能够通过搜索网络解决所有与XPages相关的问题,但这一个问题一直让我抓狂,我真的需要一些帮助: 在我的XPage上有一个带有动态数据源的面板(计算documentid和action(来自xpages:动态更改数据源时,不会更新与字段的数据绑定,xpages,Xpages,到目前为止,我已经能够通过搜索网络解决所有与XPages相关的问题,但这一个问题一直让我抓狂,我真的需要一些帮助: 在我的XPage上有一个带有动态数据源的面板(计算documentid和action(来自sessionScope)的值)。在这个面板中,我有多个编辑框,它们通过“简单绑定”绑定到数据源。在面板外,我有一个组合框,用户可以在其中选择要显示的文档和一个按钮来创建新文档。当组合框值更改时,我将documentid和action放入sessionScope,并对面板执行部分更新。一切正常
sessionScope
)的值)。在这个面板中,我有多个编辑框,它们通过“简单绑定”绑定到数据源。在面板外,我有一个组合框,用户可以在其中选择要显示的文档和一个按钮来创建新文档。当组合框值更改时,我将documentid和action放入sessionScope
,并对面板执行部分更新。一切正常,文件显示正确。当我按下按钮创建一个新文档(documentid=“”,action=“newDocument”)时,我得到一个新文档,面板中的编辑框是空的,就像它应该的那样
但是,如果在创建新文档后从组合框中选择现有文档,则编辑框不会更新,但与我刚刚创建的文档中的编辑框保持相同。我发现部分刷新对数据源有效(documentid是正确的),但数据绑定似乎不起作用,这意味着文档中的值不会写入编辑框。之后,如果我从组合框中选择另一个文档或执行另一个部分刷新,数据绑定会突然再次工作
有人知道如何解决这个问题吗?为什么我需要两次局部刷新
我试图解决这个问题但不起作用的是:
ignorerequestparameter
设置为true
computewithform的所有可能设置
我知道我可以手动将文档中的数据写入编辑框,但我认为不需要解决方法就可以解决此问题。我确信您想要做的是可能的。。。不过我需要看看你的代码来模拟一些东西来玩它。当然,您需要设置ignoreRequestParams。。我通常会不惜一切代价避免使用computeWithForm
虽然您应该能够通过数据绑定来实现这一点,但我通常更倾向于不将此类内容的编辑字段绑定到文档数据源。我想我应该让它们不绑定,然后使用SSJS填充值,然后保存值。我不认为这是一种“变通方法”或“黑客攻击”——我认为这只是另一种有效的方法。这是一些Java代码的SSJS端口,我在服务器端更改bean值时,使用它重置绑定到bean的字段的本地字段值。如果不这样做,UI字段将显示“旧”值 SSJS未经测试,因此可能存在拼写错误。如果出现错误,希望你能找到答案
function resetComponentAndChildren( component ) {
if( component instanceof javax.faces.component.EditableValueHolder ) {
// Reset value bindings on component
var valueHolder = component;
valueHolder.setSubmittedValue( null );
valueHolder.setValue( null );
valueHolder.setLocalValueSet( false );
valueHolder.setValid( true );
}
var children = component.getChildren();
for ( var i = 0; i < children.length; i++ ) {
resetComponentAndChildren( children[i] );
}
}
function resetRefreshTargetAndChildren(){
var refreshId = param.get( "$$ajaxid" ).replaceFirst( "^view:", "" );
var refreshTarget = view.findComponent( refreshId );
resetComponentAndChildren( refreshTarget );
}
函数重置组件和子组件(组件){
if(javax.faces.component.EditableValueHolder的组件实例){
//重置组件上的值绑定
var值持有人=组成部分;
valueHolder.setSubmittedValue(空);
valueHolder.setValue(空);
valueHolder.setLocalValueSet(false);
valueHolder.setValid(true);
}
var children=component.getChildren();
对于(var i=0;i
resetRefreshTargetAndChildren用于为部分刷新的区域重置字段。如果您的combobox事件导致刷新包含所有文档字段的区域,那么它应该适合您的需要(如果您的问题与我对beans的问题相同)。在组合框的onChange事件中调用它。通过尝试数据源的许多可能参数组合以及刷新选项,我找到了解决方案:
在执行面板的部分刷新时,我必须在的“服务器选项”中将中的“未经验证的流程数据”设置为true。我无法解释为什么它现在可以工作,特别是因为我甚至没有使用任何字段验证。然而,它是有效的 幸运的是,我碰巧解决了这个问题。不过,您的方法也是另一种解决方法,这也要感谢您的努力。您是对的:这不是一种黑客行为,但我认为它是一种解决方法,因为简单的数据绑定提供了许多“开箱即用”的功能,我在手动填充和保存字段时必须编写这些功能。顺便说一句:你为什么要不惜一切代价避免使用computewithform?ComputeWithFormIMO不好有几个原因。最大的问题是它分离/隐藏了你的逻辑。现在您也在表单上进行编码。越来越难维护。最好把逻辑放在尽可能少的地方。另外,如果表单计算时出现错误怎么办?很难对付。我还认为这是一个性能的打击。我确信这比呆在xpages中并坚持使用SSJS要慢。看看组件的顺序,对照JSF生命周期检查代码——执行什么以及何时执行