-1

これまで、ネットを検索することでXPagesに関連するすべての問題を解決することができましたが、これは私を夢中にさせ続け、私は本当にいくつかの助けを使うことができました:

XPageには、動的データソースを備えたパネルがあります(documentidとactionが計算されます(からの値sessionScope))。このパネルには、「単純な製本」を介してデータソースにバインドされる複数の編集ボックスがあります。パネルの外側には、ユーザーが表示するドキュメントを選択できるコンボボックスと、新しいドキュメントを作成するためのボタンがあります。コンボボックスの値が変更されたら、documentidとactionをに入れsessionScopeて、パネルの部分的な更新を実行します。すべてが正常に機能し、ドキュメントは正しい方法で表示されます。ボタンを押して新しいドキュメント(documentid = ""、action = "newDocument")を作成すると、新しいドキュメントが表示され、パネルの編集ボックスが空になります。

ただし、新しいドキュメントを作成した後でコンボボックスから既存のドキュメントを選択すると、編集ボックスは更新されませんが、作成したばかりのドキュメントと同じままになります。データソースに対して部分的な更新が機能していることはわかりましたが(documentidは正しい)、データバインディングが機能しなかったようです。つまり、ドキュメントの値が編集ボックスに書き込まれていません。その後、コンボボックスから別のドキュメントを選択するか、別の部分的な更新を実行すると、データバインディングが突然再び機能します。

誰かがこれを解決する方法を知っていますか?ここで2つの部分的な更新が必要なのはなぜですか?

私がこの問題を解決しようとしましたが、うまくいきませんでした:

  1. リクエストするデータソースのスコープを変更する
  2. パネルの部分的な更新ではなく、完全な更新を実行する
  3. ignorerequestparameterに設定true
  4. のすべての可能な設定computewithform

ドキュメントから編集ボックスに手動でデータを書き込むことができることは知っていますが、回避策なしでこれを解決できるはずだと思います。

4

3 に答える 3

1

これは、サーバー側でBean値を変更するときに、Beanにバインドされたフィールドのローカルフィールド値をリセットするために使用するJavaコードのSSJSポートです。これを行わないと、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イベントで呼び出します。

于 2012-09-26T05:48:31.473 に答える
0

データソースの多くの可能なパラメータの組み合わせと更新オプションを試すことで、解決策を見つけました。

パネルの部分的な更新を実行するとき、 「サーバーオプション」で「検証なしでデータを処理する」をtrueに設定する必要があります。特にフィールドの検証を使用していないため、なぜ今それが機能するのか説明できません。それでも、それは機能します!

于 2012-09-26T06:41:45.777 に答える
0

あなたがやりたいことは可能だと確信しています...それで遊ぶために何かをモックアップするためにあなたのコードを見る必要がありますが。確かに、ignoreRequestParamsを設定する必要があります。私は通常、computeWithFormの使用を絶対に避けようとします。

これをデータバインディングを介して機能させることができるはずですが、私は通常、このようなものの編集フィールドをドキュメントデータソースにバインドしない傾向があります。それらをバインドせずに残してから、SSJSを使用して値を設定し、値を保存すると思います。私はそれを「回避策」や「ハック」とは考えていません。これは私の意見では、それを行うためのもう1つの有効な方法です。

于 2012-09-25T15:39:37.593 に答える