xpages:动态更改数据源时,不会更新与字段的数据绑定

xpages:动态更改数据源时,不会更新与字段的数据绑定,xpages,Xpages,到目前为止,我已经能够通过搜索网络解决所有与XPages相关的问题,但这一个问题一直让我抓狂,我真的需要一些帮助: 在我的XPage上有一个带有动态数据源的面板(计算documentid和action(来自sessionScope)的值)。在这个面板中,我有多个编辑框,它们通过“简单绑定”绑定到数据源。在面板外,我有一个组合框,用户可以在其中选择要显示的文档和一个按钮来创建新文档。当组合框值更改时,我将documentid和action放入sessionScope,并对面板执行部分更新。一切正常

到目前为止,我已经能够通过搜索网络解决所有与XPages相关的问题,但这一个问题一直让我抓狂,我真的需要一些帮助:

在我的XPage上有一个带有动态数据源的面板(计算documentid和action(来自
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生命周期检查代码——执行什么以及何时执行