Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: eknori am 14.10.10 - 16:28:37

Titel: custom control bei Fehler nicht laden / rendern
Beitrag von: eknori am 14.10.10 - 16:28:37
Brauche einen Schubs in die richtige Richtung.

Ich habe ein custom control, daseine Datenquelle enthält, die auf meinem heimischen Testserver nicht vorhanden ist.
Wenn ich die Anwendung dort öffne, gibt es logischerweise einen Laufzeitfehler.

Gibt es ein On Error Konstrukt für Javascript? Ich müsste irgendwie damit "loaded" der custom control auf false setzen.
Titel: Re: custom control bei Fehler nicht laden / rendern
Beitrag von: pram am 15.10.10 - 19:30:39
Hallo Ulrich,
ich kenn mich zwar mit Custom Controls nicht so aus (ich nehm mal an es geht hier um XPages und nicht um OLE-Controls) deshalb weiß ich auch nicht ob dir ein
Code
try {
...some code
} catch(e) {
  alert(e)
}
in Javascript weiter hilft.

Gruß
Roland
Titel: Re: custom control bei Fehler nicht laden / rendern
Beitrag von: DAU-in am 16.10.10 - 07:54:09
Wenn du die Custom Control in einer Editable Area berechnest?

theoretisch sollte das gehen: wenn Heimserver, dann nimm ein leeres CC, wenn richtiger Server, dann das richtige.
Ob man die CC-Auswahl auch über den Error abfangen kann - keine Ahnung.
Titel: Re: custom control bei Fehler nicht laden / rendern
Beitrag von: eknori am 16.10.10 - 11:18:20
Danke für die Tipps. Werde ich probieren. Problem ist dann wieder, daß ich den Server irgendwo hardcoded hinterlegen muss.
Ich habe mir jetzt erst einmal so geholfen, daß ich die Anzeige des CC über ein Konfigurationsdokument ausschalte; also loaded auf false setze. Das reicht mir an der Stelle.

Würde mich nur mal interessieren, ob es generell geht zu checken, ob das Laden des CC einen Fehler erzeugt und dann das Laden verhindert ... Irgendwie beisst sich die Katze da in den Schwanz. Habe dazu auch Matt White angemailt. Mal sehen, was ihm Schlaues einfällt.

 
Titel: Re: custom control bei Fehler nicht laden / rendern
Beitrag von: eknori am 18.10.10 - 08:26:13
Habe jetzt eine teilweise Lösung.

Für den Fall, daß man ein Dokument als Datenquelle verwendet, kann man es so lösen.

Code
    <xp:this.data>
        <xp:dominoDocument var="singleDoc" action="openDocument">
            <xp:this.documentId>
<![CDATA[#{javascript:session.evaluate('@DbLookup("":"NoCache";"":"";"$lu-post-textbox";"' + 

compositeData.category +'";3;[FAILSILENT])').elementAt(0)}]]></xp:this.documentId>
        </xp:dominoDocument>
    </xp:this.data>

    <xp:this.loaded>
<![CDATA[${javascript:if (!session.evaluate('@DbLookup("":"NoCache";"":"";"$lu-post-textbox";"' + compositeData.category +'";3;[FAILSILENT])').elementAt(0)==""){
return true;
}
else {
    return false;
}}]]></xp:this.loaded>

Wichtig ist das Keyword
Code
[FAILSILENT]
Dann liefert der @DBLookup einen leeren string anstelle eines fehlers zurück. Auf diesen leeren String kann man dann prüfen.

Das Ergebnis des @DBLookup kann man auch in eine Variable schreiben. Dann spart man sich die doppelte Ausführung des Codes.

Bei einer View als Datenquelle tue ich mich nach wie vor schwer ...
Titel: Re: custom control bei Fehler nicht laden / rendern
Beitrag von: eknori am 18.10.10 - 08:58:15
Sieht dann in der bereinigten Version so aus:

Code
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.data>
        <xp:dominoDocument var="singleDoc" action="openDocument">
            <xp:this.documentId>
            <![CDATA[#{javascript:applicationScope.thisDocUNID = 
            session.evaluate('@DbLookup("":"NoCache";"":"";"$lu-post-textbox";"' 
            + compositeData.category +'";3;[FAILSILENT])').elementAt(0);
            return applicationScope.thisDocUNID;}]]>
            </xp:this.documentId>
        </xp:dominoDocument>
    </xp:this.data>

    <xp:panel style="height:2.0em;margin-bottom:0.5em" readonly="true">
        <xp:label id="docSubject" styleClass="witteblue-15em">
            <xp:this.value>
            <![CDATA[#{javascript:if 
            (singleDoc.getItemValueString("showCaption") == "1"){
            singleDoc.getItemValueString("Subject");
            }
            else {
            return ' ';
            }}]]>
            </xp:this.value>
        </xp:label>
    </xp:panel>

    <xp:inputRichText id="docBody" value="#{singleDoc.body}">
        <xp:this.style>
        <![CDATA[width:#{javascript:singleDoc.getItemValueString("blockwidth")}px]]>
        </xp:this.style>
        <xp:this.rendered>
        <![CDATA[#{javascript:if (!applicationScope.thisDocUNID == ""){
        return true;
        }
        else {
        return false;
        }}]]>
        </xp:this.rendered>
    </xp:inputRichText>

</xp:view>