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

时间:2012-09-25 15:00:17

标签: xpages

到目前为止,我已经能够通过搜索网络来解决所有与XPage相关的问题,但这个问题一直让我发疯,我真的可以使用一些帮助:

在我的XPage上,我有一个带有动态数据源的面板(记录文档和操作(来自sessionScope的值))。在这个面板中,我有多个编辑框,通过“简单绑定”绑定到数据源。在面板外面,我有一个组合框,用户可以选择要显示的文档和创建新文档的按钮。当组合框值发生变化时,我将documentid和action放到sessionScope并执行面板的部分更新。一切正常,文件以正确的方式显示。当我按下按钮创建一个新文档(documentid =“”,action =“newDocument”)时,我得到一个新文档,面板中的编辑框是空的,就像应该的那样。

但是,如果我在创建新文档后从组合框中选择现有文档,则编辑框不会更新,但保持与我刚创建的文档中的相同。我发现部分刷新适用于数据源(documentid是正确的)但似乎数据绑定不起作用,这意味着文档中的值不会写入编辑框。之后,如果我从组合框中选择另一个文档或执行另一次部分刷新,数据绑定会突然再次起作用。

有谁知道如何解决这个问题?为什么我需要在这里进行2次部分刷新?

我试图解决这个问题,但没有奏效:

  1. 更改数据源范围以请求
  2. 执行完整更新,而不仅仅是部分更新面板
  3. ignorerequestparameter设为true
  4. computewithform
  5. 的所有可能设置

    我知道我可以手动将文档中的数据写入编辑框,但我认为应该可以在没有解决方法的情况下解决这个问题。

3 个答案:

答案 0 :(得分:1)

这是一些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 );
}

resetRefreshTargetAndChildren 用于重置部分刷新的区域的字段。如果你的组合框事件导致刷新了包含所有文档字段的区域,那么它应该符合你的需求(如果你的问题与我的bean相同)。在组合框的onChange事件中调用它。

答案 1 :(得分:0)

我确定你想要做的事情是可能的......虽然我需要看到你的代码来模拟一些东西来玩它。当然你会想要设置ignoreRequestParams ..我通常会尽量避免使用computeWithForm。

虽然您应该能够通过数据绑定使其工作,但我通常更倾向于不将类似这样的编辑字段绑定到文档数据源。我想我会让它们保持未绑定状态,然后使用SSJS填充值,然后保存值。我不认为这是“解决方法”或“黑客” - 这只是我认为的另一种有效方式。

答案 2 :(得分:0)

通过尝试大量可能的数据源参数组合以及刷新选项,我找到了解决方案:

执行面板的部分刷新时,我必须在“服务器选项”中将“未经验证的处理数据”设置为true。我无法解释为什么它现在有效,特别是因为我甚至没有使用任何领域的验证。然而,它有效!