1

実際には、特定のフィールドの 読み取り専用プロパティに true を設定しました。Xpage

そして、クライアント側のJavaScriptで編集するようにモードを変更しようとしました。しかし、私は変更することができません。
次のコードを使用しました...

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

そしてまた

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

どちらも失敗…

(@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>
4

3 に答える 3

2

さらに検討すると、この問題はフィールド自体とは何の関係もありません。質問に含まれているコードは、目的の応答に適しています。むしろ、問題は、イベントがdijit.Dialog内で定義されていることです。

Dojoがダイアログを解析するとき、レイアウト上の理由からDOM要素を本文の最後に移動します。残念ながら、これによってフォームの外にも移動します。これにより、サーバー側のイベントが中断されます。これは、イベントデータがフォームの一部としてシリアル化されなくなったためです。したがって、あなたの例では、イベントコードが間違っているためではなく、イベント自体がトリガーされないためにイベントが失敗します。

これに対する理想的な解決策は、指定されたdojoTypeを持つパススルーdivの代わりに、拡張ライブラリ(または8.5.3 UP1)のDialogコンポーネントを使用することです。これがオプションでない場合は、回避策があります...ページの下部に次のコンポーネントを追加します。

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

これにより、解析されたすべてのダイアログがフォーム内に戻され、ダイアログ内のイベントが再び適切に発生するようになります。

于 2012-02-27T22:16:47.493 に答える
1

このサーバー側で行う場合は、読み取り/編集モードを切り替えるボタンの例を次に示します。

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

このサイトを見て、SSJS 経由で操作できるすべてのコンポーネントのすべてのプロパティを確認してください。

于 2012-02-18T15:59:07.163 に答える
0

<xp:inputText id="read" readonly="true"></xp:inputText> を使用してフィールドを作成する

サーバーは <SPAN タグを作成します - これはテキスト フィールドに変換できません

<span id="view:_id1:inputText1"></span>

8.5.3 では、フィールドのすべてのプロパティに移動し、値が True の READONLY の属性を追加します。

これにより、次のマークアップが作成されます

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

R8.5.3 より前のバージョンでは、ページの onClientLoad イベントで、READONLY 属性をプログラムでフィールドに追加できます。

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

ここにマークアップがあります

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

次に、フォームにフィールドを正しく作成したら、次を使用して編集可能にすることができます

document.getElementById("#{id:read}").removeAttribute('readOnly');

于 2012-02-17T18:06:24.957 に答える