Jeg har længe været irriteret over ikke at kunne definere en server side Javascript (SSJS) funktion på en enkelt XPage eller oftere en Custom Control.
Man kan naturligvis altid tilføje en funktion til et 'script library', men måske skal funktionen kun bruges indenfor denne ene kontrol (mange steder) og ved at lægge den i et globalt 'library' så vil vi "forurene" systemet som helhed.
Så i dag slog en idé ned i mig, da jeg sad og redigerede en Custom Control. Jeg prøvede den af - og den virker...!!
Jeg prøvede simpelthen at tilføje en funktion til en datacontext variabel:
<xp:this.dataContexts>
<xp:dataContext var="localSSJS">
<xp:this.value><![CDATA[#{javascript:
// Sneak a method in here that can be called from the entire this CC
var getCellStyle = function(id){
var selected = document.getValue(FN_RiscCellId) == id;
return 'matrixCell'+getLabel('color5x5Matrix'+id, compositeData.formName) + (selected ? ' circle' : '');
}
}]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
Og senere kunne jeg bruge koden i Custom Control'en som her:
<xp:td id="td11">
<xp:this.styleClass><![CDATA[#{javascript:getCellStyle('2.5')}]]></xp:this.styleClass>
:
:
</xp:td>
Og voilà - vi har en funktion defineret inden for. én XPage eller Custom Control som vi kan bruge mange steder for at undgå at duplikere logik - og stadigvæk uden at tilføje den til et globalt 'script library'!