2

af:table コンポーネントの「selectionListener」属性のデフォルト値は、通常、次のようになります。 selectionListener="#{bindings.IterBinding.collectionModel.makeCurrent}"

ただし、特別な選択処理が必要な場合は、通常はバッキング Bean で選択イベントのカスタム ハンドラーを指定できます。このカスタム ハンドラーの最初の手順として、行を現在の行にするための既定の機能がプログラムによって呼び出されます。これは、次のコード スニペットのようになります。

public void testSelectionListener(SelectionEvent selectionEvent) {        
    JSFUtils.resolveMethodExpression("#{bindings.IterBinding.collectionModel.makeCurrent}", null, 
                                   new Class[]{SelectionEvent.class}, new Object[]{selectionEvent});        
}

これは、標準の選択ハンドラーとまったく同じように動作するはずですよね?
しかし、そうではありません。
テーブル列の 1 つでチェック ボックスをクリックして選択の変更をトリガーする場合、この af:selectBooleanCheckbox の「valueChangeListener」はこの機会に起動しません。2 回目にクリックすると発火します。デフォルトの「selectionListener」を使用すると、常に期待どおりに起動します。

カスタム ハンドラーの何が問題なのですか?

4

2 に答える 2

5

わかりました、この奇妙な動作の犯人が見つかりました。
ページ・マークアップの編集中に、JDeveloperによって、pageDefファイルのイテレータ・バインディングの「ChangeEventPolicy」属性の値が「デフォルト(なし)」から「ppr」に変更されました。
これは、この奇妙な動作につながります。
手動で元の値に戻した後、すべてが期待どおりに機能します。
「ppr」設定はかなりバグがあるようです。タブを時々切り替えると、af:panelTabbed で同様の問題が発生しました。

于 2012-01-09T13:33:04.757 に答える
0

以下のコードを試してください:

public void onTableSelect(SelectionEvent selectionEvent) { 

    // --- perform optional pre-processing here --- //

    RichTable _table = (RichTable ) selectionEvent.getSource(); 
    CollectionModel model = (CollectionModel ) _table.getValue(); 
    JUCtrlHierBinding _binding = (JUCtrlHierBinding) model.getWrappedData(); 
    DCIteratorBinding iteratorBinding = _binding.getDCIteratorBinding(); 
    Object _selectedRowData = _table ́.getSelectedRowData(); 
    JUCtrlHierNodeBinding node = (JUCtrlHierNodeBinding) _selectedRowData ; 
    Key rwKey = node.getRowKey();
    iteratorBinding.setCurrentRowWithKey(rwKey.toStringFormat(true));

    // --- perform optional post-processing here --- // 
}
于 2012-08-09T04:27:04.323 に答える