2012-02-17 28 views
1

實際上,對於特定的領域,我已經設置爲屬性-只讀Xpage如何將Editbox的模式從讀取模式更改爲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> 
+0

僅在客戶端腳本中不可行。您必須發出部分刷新,這將會以不同的方式呈現編輯框(跨讀取模式與輸入編輯模式)。 – 2012-02-20 23:04:28

回答

2

經過進一步檢查,此問題與該字段本身無關:問題中包含的代碼適合所需的響應。相反,問題在於事件是在dijit.Dialog中定義的。

當Dojo分析對話框時,出於佈局的原因,它將DOM元素移動到主體的末尾。不幸的是,這也將它移到了表單之外。這會打破所有服務器端事件,因爲事件數據不再被序列化爲表單的一部分。因此,在您的示例中,事件失敗並不是因爲事件代碼錯誤,而是因爲事件本身從未觸發。

對此的理想解決方案是使用Extension Library(或8.5.3 UP1)中的Dialog組件而不是具有指定dojoType的passthru div。如果這是不是一種選擇,有一個解決方法......在頁面的底部添加以下組件:

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

這應當引起全解析對話框移回形式裏面,讓它們內部事件再次適當地開火。

+0

我把這塊腳本塊放到我的頁面[XSP源碼]中。但現在彈出本身不會來...我使用Notes 8.5.2,是否有必要設置在我們的Xpage屬性中設置? – Ramkumar 2012-02-29 05:01:57

0

通過創建使用 < XP領域:inputText的ID =「read」readonly =「true」> </xp:inputText >

服務器創建一個< SPAN標籤 - 它不能被轉換成文本字段

<跨度ID = 「觀點:_id1:inputText1」 > </SPAN >

在8.5.3你會去在球場上的所有屬性,並添加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您可以只讀屬性添加到字段編程使用

dojo.attr(「#{ID:讀}」頁面onClientLoad事件,「READONLY」,「真正」);

這裏的標記

<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:讀}」)。的removeAttribute( 'readOnly的');

+0

In Inputbox 請嘗試使用它不起作用 – Ramkumar 2012-02-23 09:17:35

+0

服務器正在創建SPAN時顯示 - 所以你不能使用這種方法,如果你想編輯網頁中的字段 - 我會提供更好的答案,現在我明白了問題 – MarkyRoden 2012-02-24 18:42:04

1

如果你要做到這一點的服務器端,下面是切換讀/編輯模式的按鈕的例子:

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

this site看看,看看所有屬性的所有組件你可以通過SSJS進行交互。

+0

其實我在dojo dijit.dialog中使用這個元素,所以服務器側腳本需要更新相應的項目...... – Ramkumar 2012-02-23 09:20:01

+0

這正是部分刷新事件的作用。將事件定義爲服務器端,包含調用以將組件的readonly屬性設置爲false(根據Keith的建議),並將事件的刷新ID設置爲包含該字段的任何容器。注意:即使您可以切換隻讀屬性客戶端,如果您希望存儲在該字段中輸入的任何數據,這仍然是錯誤的方法;服務器仍然會認爲該組件是隻讀的,因此會忽略爲該字段發佈的任何值。 – 2012-02-26 20:16:51

+0

@TimTripcony:是蒂姆我已經嘗試了該字段的部分刷新...請再次查看該問題...(我改變了) – Ramkumar 2012-02-27 09:31:02