2013-02-09 5 views
5

Beim Übergeben von Daten an ein benutzerdefiniertes Steuerelement habe ich immer das CompositeData-Objekt verwendet, um auf diese Daten im Steuerelement zuzugreifen. Dies funktioniert einwandfrei, mit Ausnahme des beforeRenderResponse-Ereignisses des benutzerdefinierten Steuerelements. Nehmen Sie diesen Code als Beispiel:compositeData des benutzerdefinierten Steuerelements ist im beforeRenderResponse-Ereignis nicht definiert

<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"/> 

Im afterPageLoad Fall die typeof des compositeData ist "com.ibm.xsp.binding.PropertyMap". Im Ereignis beforeRenderResponse gibt derselbe Typ jedoch "undefined" zurück.

Wie kann ich auf die compositeData im beforeRenderResponse-Ereignis zugreifen?

+0

Versuchen Sie die beforeRenderResponse auf "page load" zu berechnen, indem Sie $ anstelle von # verwenden () –

+0

Wenn ich das Ereignis beim Laden der Seite berechne, erhalte ich einen Fehler: "getComponent() ist null". Wie auch immer, Computing nur beim Laden der Seite ist in meinem Fall nicht wirklich eine Option, weil ich das benutzerdefinierte Steuerelement teilweise aktualisieren möchte, wenn sich seine Parameter ändern. –

+0

Basierend auf meiner Beobachtung passiert dies nicht nur für compositeData, sondern auch für currentDocument und andere Datenquellen, die in einer xpage definiert sind. – rfk

Antwort

6

In beforePageLoad oder afterPageLoad eine SSJS Variable mit einem Verweis auf diecompositeData erstellen:

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

Auf diese Weise können Sie die PropertyMap während der Rendering Phase zuzugreifen. Wenn Sie eine Eigenschaft Test haben, können Sie dann acces es so aus:

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

EDIT: Dies funktioniert nur, wenn die Seite geöffnet wird (pageload). Wenn Sie die Seite aktualisieren, funktioniert dies nicht. Wenn es mit teilweise refreshs laufen muss, haben Sie dies tun:

Zuerst müssen Sie eine ID zu Ihrer benutzerdefinierten Steuerelement hinzufügen:

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

Auf diese Weise können Sie die benutzerdefinierte Steuerung als reguläres zugreifen Komponente mit getComponent(). Jetzt können Sie die PropertyMap der Komponente in der Veranstaltung individuelle Steuerung zuzugreifen, die die Variable hält Sie wollen:

<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> 

EDIT von XPages-Noob: Das Beispiel von oben funktioniert gut für statische benutzerdefinierte Regeleigenschaften. Wenn jedoch eine Eigenschaft berechnet wird, geben die verschiedenen get-Funktionen der Eigenschaftszuordnung ein wertbindendes Objekt anstelle des Werts selbst zurück. Daher kann man die folgende Funktion als Abhilfe verwenden:

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 
} 

Wenn Sie wollen zum Beispiel die Eigenschaft „Test“ erhalten, ruft getPara („test“). Der zurückgegebene Wert sollte compositeData.test entsprechen.

+0

Ich habe das schon einmal versucht, aber dieser Trick funktioniert nur beim ersten Laden der Seite. Wenn ich das benutzerdefinierte Steuerelement teilweise aktualisiere, ist der Typ der Hilfsvariablen (hlp) wieder undefiniert, wahrscheinlich weil "var hlp = compositeData;" wird während der Aktualisierung nicht ausgeführt und HLP existiert nicht mehr. –

+0

Der Teil Refresh Teil Ihrer Frage nicht bemerkt. Ich habe meine Antwort aktualisiert. –

+0

Vielen Dank für Ihre Lösung. Obwohl ich nicht verstehe, warum compositeData im beforeRenderResponse-Event nicht verfügbar ist, funktioniert es jetzt gut. Ich hoffe, es macht Ihnen nichts aus, dass ich Ihrer Antwort ein paar Zeilen hinzugefügt habe, die den Fall beschreiben, in dem die Eigenschaften des benutzerdefinierten Steuerelements nicht statisch sind. –