2017-11-03 1 views
2

Ich habe ein benutzerdefiniertes Steuerelement erstellt, das eine Arraylist von Java-Objekten über eine Wiederholungssteuerung rendert. Über die Eigenschaftsdefinition kann ich angeben, welche Felder aus dem zugrunde liegenden Java-Objekt angezeigt werden sollen. Im Back-End lese ich diesen Wert z.B. überÜbergeben Sie eine Renderfunktion über Eigenschaftsdefinition des benutzerdefinierten Steuerelements

Dies funktioniert gut mit statischen Daten, aber manchmal möchte ich das vor dem Rendern z. wenn das Feld einen Notiznamen enthält und ich nur den allgemeinen Namen anzeigen möchte.

Ich frage mich, wie ich so etwas einrichten könnte.

Jetzt übergebe ich nur den Feldnamen, der von der CC abgeholt wird, um den Wert zu lesen.

z. Für das jQuery DataTables-Plugin können Sie eine Renderfunktion für eine Spalte definieren und die Datenvariable dieser Spalte innerhalb dieser Renderfunktion verwenden (z. B. eine Ankerverknüpfung oder eine Schaltfläche in dieser Spalte erstellen).

Kann ich etwas ähnliches für SSJS z. Ich übergebe die Renderfunktion als Text (oder Objekt?) Und im Backend wird es in ssjs umgewandelt.

Antwort

0

Funktionen in JavaScript sind erstklassige Bürger auf Objekten. Angenommen, Sie haben ein JS-Objekt mit allen Renderfunktionen erstellt und in einem der Bereiche gespeichert. Z.B. viewScope.renderFunctions. übergeben Sie dann den Namen der Funktion machen und den Innenbereich so etwas wie:

var renderfunc = viewScope.renderFunctions[funcname]; 
    var result = renderfunc(rawdata); 
     return result; 

, die den Trick tun sollten

+0

Sie könnten die Funktion auch selbst in einem Parameter vom Typ Objekt übergeben – stwissel

0

ich hier eine Antwort auf Stackoverflow gefunden. Der Eventhandler für meine Schaltfläche sieht wie folgt:

<xp:eventHandler event="onclick" submit="true" 
      refreshMode="partial" refreshId="pnlContainer" 
      action="#{javascript:if (compositeData.actionButton.action) if (!compositeData.actionButton.action.call()) return;}"> 
     </xp:eventHandler> 

Für meine individuelle Kontrolle Ich habe eine Eigenschaft ein:

<property> 
     <property-name>action</property-name> 
     <property-class>javax.faces.el.MethodBinding</property-class> 
     <property-extension> 
      <designer-extension> 
      <editor>com.ibm.workplace.designer.ide.xfaces.internal.editors.MethodBindingEditor</editor> 
      </designer-extension> 
     </property-extension> 
     <description>ssjs that action button must perform</description> 
     </property> 

Stellen Sie sicher, die Klasse und Editor wie oben sind.

Dann wird die Eigenschaft auf der XPage das benutzerdefinierte Steuerelement enthält, enthält die ssjs:

action="#{javascript:removeSelected}" 

Dies ist eine Funktion, die in einer SSJS Skriptbibliothek befindet. Der Schlüssel hier ist keine Parameter von Klammern zur Verfügung zu stellen (!!!)

Die SSJS Funktion wie folgt lautet:.

function removeSelected(){ 
    var accessList = sessionScope.get("removalList"); 
    var nsf_committee = datasources["COM1_DB_FILEPATH"];   
    var db:NotesDatabase = session.getDatabase(session.getServerName(), nsf_committee); 
    for (var i = 0; i < accessList.length; i++) { 
     var doc:NotesDocument = db.getDocumentByUNID(accessList[i]); 
     if (null != doc){ 
      doc.remove(true); 
      accessList.remove(accessList[i]); 
     } 
    } 
} 

(hier entferne ich Dokumente aus der Datenbank die unid IDs befinden sich in einem ein Die Array-Liste wird über eine Checkbox-Gruppe für jede Zeile in meinem Wiederholungssteuerelement festgelegt.)

0

In Anbetracht der Tatsache, dass Sie wahrscheinlich die Komponente in vielen Kontexten Ihrer App wiederverwenden möchten, würde ich das Problem mit einer Hilfsklasse angehen und Schnittstelle

public class FieldManager { 

    public static interface FieldDetail { 
    String getName(); 
    void getAction(); 
    } 

    private List<FieldDetail> fieldDetails = new List<FieldDetail>(); 

    public FieldManager() { 

    } 

    public FieldManager(List<FieldDetail> fieldDetails) { 
    this.fieldDetails.addAll(fieldDetails); 
    } 

    public void addFieldDetail(FieldDetail fieldDetail) { 
    this.fieldDetails.add(fieldDetail); 
    } 

    public List<FieldDetail> getFieldDetails() { 
    return fieldDetails; 
    } 

} 

Mit dieser prägnanten Definition können Sie jetzt die Schnittstelle FieldDetail mit einer generischen Klasse oder alternativen spezialisierten Klassen implementieren.

dann in dem benutzerdefinierten Steuerelement setzen Sie eine Eigenschaft als value oder was auch immer, der <property-class> Tag FieldManager und in der Zollkontrolle, die Sie würde wissen, wie alles spielt, weil die Klasse FieldManager und die FieldDetail der Vertrag für Sie sind.

<xp:repeat disableOutputTag="true" 
     value="#{compositeData.value.fieldDetails}" var="fieldDetail"> 
    <xp:link text="#{fieldDetail.name}"> 
     <xp:eventHandler event="onclick" submit="true" 
       refreshMode="partial" refreshId="pnlContainer" 
       action="#{fieldDetail.action}"> 
     </xp:eventHandler> 
    </xp:link> 
</xp:repeat> 

Oder was auch immer Ihr Code sein könnte. Wie auch immer, das ist das Wesentliche.

Verwandte Themen