Come modificare la modalità di Editbox dalla modalità di lettura per modalità di modifica in XPage?

StackOverflow https://stackoverflow.com/questions/9326874

  •  27-10-2019
  •  | 
  •  

Domanda

In realtà, ho impostato fedele alla proprietà- di sola lettura in Xpage per un determinato campo.

E ho provato a cambiare il suo modo di modificare in javascript lato client. Ma io non sono in grado di cambiare.
Ho usato il seguente codice ...

document.getElementById("#{id:read}").readOnly=false; 

e anche

dojo.attr("#{id:read}","readOnly",false); 

Entrambi sono riuscito ...

(@Trim)
Also in Server side Javascript XSP Code is:      

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" dojoParseOnLoad="true"
dojoTheme="true">
<xp:this.resources>
    <xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>

<div id="dojoTest" dojoType="dijit.Dialog">
<xp:inputText id="field" defaultValue="Hello" readonly="true"></xp:inputText>

<xp:button value="Label" id="button1">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="partial" refreshId="field">
        <xp:this.action> <![CDATA[{javascript:getComponent("field").setReadonly(false);}]]></xp:this.action>
    </xp:eventHandler></xp:button>
<xp:br></xp:br></div>

<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Show Popup" id="button2">
    <xp:eventHandler event="onclick" submit="false">
        <xp:this.script><![CDATA[dijit.byId("dojoTest").show();]]> </xp:this.script>
    </xp:eventHandler></xp:button>
</xp:view>
È stato utile?

Soluzione

Dopo un ulteriore riesame, la questione non ha nulla a che fare con il campo stesso: il codice incluso nella domanda è opportuno la risposta desiderata. Piuttosto, il problema è che l'evento è definito all'interno di un dijit.Dialog.

Quando Dojo analizza una finestra, si muove di elementi DOM alla estremità del corpo per motivi di layout. Purtroppo, questo si muove anche al di fuori della forma. Questo rompe tutti gli eventi sul lato server, in quanto i dati dell'evento non viene serializzato come parte del modulo. Quindi nel tuo esempio, l'evento non riesce, non perché il codice evento è sbagliato, ma perché l'evento in sé non viene mai attivato.

La soluzione ideale per questo è di utilizzare il componente di dialogo dalla libreria di estensione (o 8.5.3 UP1) invece di un div con un passante specificata dojoType. Se questo non è un'opzione, c'è una soluzione ... aggiungere il seguente componente alla parte inferiore della pagina:

<xp:scriptBlock>
    <xp:this.value><![CDATA[XSP.addOnLoad(function(){
    var dominoForm = XSP.byId("#{javascript:return view.findScriptCollector().getClientId(facesContext);}");
    dojo.query("div.dijitDialog").forEach(function(eachDialog){
        dojo.place(eachDialog, dominoForm, "last");
    });
});]]></xp:this.value>
</xp:scriptBlock>

Questo dovrebbe causare tutte le finestre di dialogo analizzato per essere spostate indietro all'interno del modulo, che consente eventi al loro interno ancora una volta correttamente il fuoco.

Altri suggerimenti

Se stai cercando di fare questo lato server, ecco un esempio di un pulsante che alterna lettura / modalità di modifica:

var comp = getComponent("inputText1");
if (comp && !comp.isReadonly()) {
    comp.setReadonly(true);
}else if (comp && comp.isReadonly()) {
    comp.setReadonly(false);
}

Date un'occhiata al questo sito per vedere tutte le proprietà per tutti i componenti che è possibile interagire con via SSJS.

Con la creazione del campo utilizzando

il server crea un

In 8.5.3 si dovrebbe andare a tutte le proprietà sul campo e aggiungere un attributo di READONLY con un valore True

Questo creerebbe il seguente markup

<xp:inputText id="read" defaultValue="Marky">
    <xp:this.attrs>
        <xp:attr name="READONLY" value="true"></xp:attr>
    </xp:this.attrs>
</xp:inputText>

Nelle versioni prima di R8.5.3 è possibile aggiungere l'attributo di sola lettura al campo di programmazione sull'evento onClientLoad della pagina utilizzando

dojo.attr ( "# {id: lettura}", "READONLY", "true");

Ecco il markup

<xp:inputText id="read" defaultValue="Marky">

</xp:inputText>

<xp:eventHandler event="onClientLoad" submit="false">
    <xp:this.script><![CDATA[dojo.attr("#{id:read}", "READONLY", "true");]]></xp:this.script>
</xp:eventHandler>

Poi, una volta si ha creare il campo del modulo correttamente, si può rendere modificabile utilizzando

document.getElementById. ( "# {Id: lettura}") removeAttribute ( 'readOnly');

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top