5

カスタムコントロールにデータを渡すとき、私は常にcompositeDataオブジェクトを使用して、コントロール内からこのデータにアクセスしていました。カスタムコントロールのbeforeRenderResponseイベントを除いて、これは正常に機能しています。このコードを例として取り上げます。

<xp:this.afterPageLoad><![CDATA[#{javascript:getComponent("lbl0").setValue(typeof(compositeData));}]]></xp:this.afterPageLoad>
<xp:this.beforeRenderResponse><![CDATA[#{javascript:getComponent("lbl1").setValue(typeof(compositeData));}]]></xp:this.beforeRenderResponse>
<xp:label value="" id="lbl0"/>
<xp:label value="" id="lbl1"/>

afterPageLoadイベントでは、compositeDataのtypeofは「com.ibm.xsp.binding.PropertyMap」です。ただし、beforeRenderResponseイベントでは、同じタイプが「未定義」を返します。

beforeRenderResponseイベントでcompositeDataにアクセスするにはどうすればよいですか?

4

1 に答える 1

6

beforePageLoadまたはafterPageLoadで、 compositeDataへの参照を使用してSSJS変数を作成します。

<xp:this.beforePageLoad>
   <![CDATA[#{javascript:
      var hlp=compositeData;
   }]]>
</xp:this.beforePageLoad>

これにより、レンダリングフェーズ中にPropertyMapにアクセスできます。プロパティテストがある場合は、次の方法でアクセスできます。

<xp:this.afterRenderResponse>
   <![CDATA[#{javascript:
      print( hlp.test );
   }]]>
</xp:this.afterRenderResponse>

編集: これは、ページが開かれている場合にのみ機能します(pageLoad)。ページを更新すると、これは機能しません。部分的な更新で実行する必要がある場合は、次のようにする必要があります。

まず、カスタムコントロールにIDを追加する必要があります。

<xc:ccWithId test="I am your property" id="ccWithId" />

これにより、 getComponent()を使用して通常のコンポーネントとしてカスタムコントロールにアクセスできます。これで、必要な変数を保持するカスタムコントロールのイベントでコンポーネントのpropertyMapにアクセスできます。

<xp:this.beforeRenderResponse>
   <![CDATA[#{javascript:
      var cmp:com.ibm.xsp.component.UIIncludeComposite = getComponent("ccWithId");
      print("Value of 'test' -> " + cmp.getPropertyMap().getString("test") )
   }]]>
</xp:this.beforeRenderResponse>

xpages-noobによる編集:上記の例は、静的カスタムコントロールプロパティに対して正常に機能します。ただし、プロパティが計算される場合、プロパティマップのさまざまなget関数は、値自体ではなく、値バインディングオブジェクトを返します。したがって、回避策として次の関数を使用できます。

 var thisData:com.ibm.xsp.binding.PropertyMap=getComponent("ccWithId").getPropertyMap();
function getPara(key) {
    var x=thisData.get(key);
    if (@Ends(typeof(x),"ValueBinding")) return x.getValue(facesContext);
    else return x
}

たとえば、プロパティ "test"を取得する場合は、getPara( "test")を呼び出します。戻り値はcompositeData.testと同じである必要があります。

于 2013-02-09T21:13:50.527 に答える