【问题标题】:How to change the mode of Editbox from read mode to edit mode in Xpage?如何在 Xpage 中将 Editbox 的模式从读取模式更改为编辑模式?
【发布时间】:2012-02-17 10:48:58
【问题描述】:

实际上,我已将 Xpage 中的属性 Read-Only 设置为特定字段的 true。

我尝试将其模式更改为在客户端 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>

【问题讨论】:

  • 仅在客户端脚本中不可能。您必须发出部分刷新,它将以不同的方式呈现编辑框(读取模式下的跨度与编辑模式下的输入)。

标签: javascript lotus-notes xpages


【解决方案1】:

经过进一步审查,此问题与字段本身无关:问题中包含的代码适合所需的响应。相反,问题在于事件是在 dijit.Dialog 中定义的。

Dojo 解析对话框时,出于布局原因,它会将 DOM 元素移动到正文的末尾。不幸的是,这也将它移到了表单之外。这会破坏任何服务器端事件,因为事件数据不再作为表单的一部分进行序列化。所以在你的例子中,事件失败不是因为事件代码错误,而是因为事件本身从未被触发。

对此的理想解决方案是使用扩展库(或 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>

这应该会导致所有已解析的对话框移回表单内,从而允许其中的事件再次正确触发。

【讨论】:

  • 我将这段脚本块放入我的页面 [XSP 源代码]。但是现在弹出窗口本身并没有出现......我使用的是Notes 8.5.2。在我们的Xpage属性中是否需要设置任何必要的设置?
【解决方案2】:

如果您希望在服务器端执行此操作,以下是切换读取/编辑模式的按钮示例:

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

查看this site 以查看您可以通过 SSJS 与之交互的所有组件的所有属性。

【讨论】:

  • 其实我是在dojo dijit.dialog中使用这个元素的,所以服务器端脚本需要更新对应的item...
  • 这正是部分刷新事件的用途。将事件定义为服务器端,包括将组件的 readonly 属性设置为 false 的调用(根据 Keith 的建议),并将事件的刷新 ID 设置为包含该字段的任何容器。注意:即使您可以切换只读属性客户端,如果您希望存储在该字段中输入的任何数据,那仍然是错误的方法;服务器仍会认为该组件是只读的,因此会忽略为该字段发布的任何值。
  • @TimTripcony:是的,蒂姆我已经尝试过对该字段进行部分刷新...请再次查看问题...(我已更改)
  • 也许使用 viewscope var 来控制只读属性?所以在事件处理程序 requestScope.setEditable = true 和字段只读属性中 #{javascript: return requestScope.containsKey("setEditable")} ?
【解决方案3】:

通过使用创建字段

服务器创建一个

在 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');

【讨论】:

  • 在输入框中 请试试这个它不起作用
  • 显示时服务器正在创建一个SPAN - 所以如果你想编辑网页中的字段,你不能使用这个方法- 现在我明白了问题,我会提供更好的答案
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多