5

PlaceBar (extlib oneui アプリケーション レイアウト) に動的にアクションを追加したい。

一部の構成ドキュメントにいくつかの URL が保存されています。これらの URL に基づいて、基本的な子ノードを持つコンテナー ノードを作成したいと考えています。すべての子ノードは、リストから 1 つの URL を使用します。コンテナ ノードを作成し、それに子ノードを動的に追加するにはどうすればよいですか? このためのSSJS/Java/CSJSコードのサンプルはありますか?

ありがとうございました..

4

4 に答える 4

4

xe:repeatTreeNode245 ページの XPages Extension Library ブックで説明されている Repeat Node ( ) を参照してください。

これは非常に簡単な例です(本から直接引用):

<xe:repeatTreeNode var="val">
   <xe:this.value>
      <![CDATA[#{javascript:return [
        ["Home","home"],
        ["Domino","domino"],
        ["OneUI","oneui"]
      ];}]]>
   </xe:this.value>
   <xe:this.children>
      <xe:basicLeafNode>
         <xe:this.submitValue><![CDATA[#{javascript:return val[1]}]]></xe:this.submitValue>
         <xe:this.label><![CDATA[#{javascript:return val[0]}]]></xe:this.label>
      </xe:basicLeafNode>
   </xe:this.children>
</xe:repeatTreeNode>
于 2012-08-13T20:05:20.997 に答える
1

基本的には上記のコードと同じですが、Javaです。次に、faces-config.xmlファイルのこの小さなコード

<lifecycle>
    <phase-listener>com.company.app.phaselisteners.PlaceBarInjector</phase-listener>
</lifecycle>

package com.company.app.phaselisteners;





public class PlaceBarInjector implements PhaseListener {

      private static final long serialVersionUID = 1L;

      public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    public void beforePhase(PhaseEvent event) {
        UIComponent oneui = JSFUtil.findComponent("applicationLayout1");
    Configruation uiconfig = oneui.getConfiguration();
    ComplexContainerTreeNode containerNode = new ComplexContainerTreeNode();
    containerNode.setLabel("Cluster Applications");

    Document docAppProfile = docColl.getFirstDocument();
    while(docAppProfile != null)
    {
            ComplexLeafTreeNode children = new ComplexLeafTreeNode();
            children.setComponent(oneui);
            children.setLabel(docAppProfile.getItemValueString("appTitle"));
        children.setHref(docAppProfile.getItemValueString("appURL"));
            children.setImage(docAppProfile.getItemValueString("appLogoThumb"));
            containerNode.addChild(children);

            Document tempDoc = docColl.getNextDocument(docAppProfile);
            docAppProfile = tempDoc;
    }
    uiConfig.addPlaceBarAction(containerNode);
    }

    public void afterPhase(PhaseEvent event) {
        System.out.println("END PHASE " + event.getPhaseId());
    }

}
于 2012-08-16T11:51:24.203 に答える
1

迅速な返信ありがとうございます。これは私にとって非常に有益な情報です。

XSnippet コードといくつかのリバース エンジニアリングに基づいて見つけた別の方法。次のようにxpageのJavaコードから:

var oneui = getComponent("applicationLayout1");
var uiConfig = oneui.getConfiguration();
var containerNode:com.ibm.xsp.extlib.tree.complex.ComplexContainerTreeNode = new com.ibm.xsp.extlib.tree.complex.ComplexContainerTreeNode();
containerNode.setLabel("Cluster Applications");

var docAppProfile = docColl.getFirstDocument();
while(docAppProfile != null)
{
    var children:com.ibm.xsp.extlib.tree.complex.ComplexLeafTreeNode = new com.ibm.xsp.extlib.tree.complex.ComplexLeafTreeNode();
    children.setComponent(oneui);
    children.setLabel(docAppProfile.getItemValueString("appTitle"));
    children.setHref(docAppProfile.getItemValueString("appURL"));
    children.setImage(docAppProfile.getItemValueString("appLogoThumb"));
    containerNode.addChild(children);

    children = null;
    var tempDoc = docColl.getNextDocument(docAppProfile);
    docAppProfile = null;
    docAppProfile = tempDoc;
}
uiConfig.addPlaceBarAction(containerNode);

これはサンプルコードのみです。これを Java コードに変換し、シリアル化してパフォーマンスを向上させ、アプリケーションで一度だけロードします。

助けてくれてありがとう。

于 2012-08-16T03:03:21.480 に答える
0

もう 1 つできることは、PhaseListener を使用して、応答をレンダリングする前にアイテムをコンテナ ノードに注入することです。次に、すべてのページを 1 か所で制御できます。

于 2012-08-13T20:16:08.097 に答える