Как изменить режим Editbox из режима чтения в режим редактирования в XPage?
-
27-10-2019 - |
Вопрос
На самом деле, я поставил правду в собственности- Только для чтения в 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>
Решение
После дальнейшего рассмотрения эта проблема не имеет ничего общего с самой областью: код, включенный в вопрос, подходит для желаемого ответа. Скорее, проблема в том, что событие определено внутри dijit.dialog.
Когда Dojo анализирует диалог, он перемещает элементы DOM к концу тела по причинам макета. К сожалению, это также выходит за пределы формы. Это нарушает любые события на стороне сервера, потому что данные о событии больше не сериализуются как часть формы. Таким образом, в вашем примере событие не удается не потому, что код события неверен, а потому, что само событие никогда не запускается.
Идеальным решением для этого является использование диалогового компонента из библиотеки расширения (или 8.5.3 UP1) вместо 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>
Это должно привести к тому, что все проанализированные диалоги были перемещены обратно в форму, позволяя событиям внутри них снова правильно стрелять.
Другие советы
Если вы хотите сделать эту сторону сервера, вот пример кнопки, которая переключает режим чтения/редактирования:
var comp = getComponent("inputText1");
if (comp && !comp.isReadonly()) {
comp.setReadonly(true);
}else if (comp && comp.isReadonly()) {
comp.setReadonly(false);
}
Взгляни на этот сайт Чтобы увидеть все свойства для всех компонентов, с которыми вы можете взаимодействовать через SSJS.
Создав поле, используяu003Cxp:inputText id="read" readonly="true">u003C/xp:inputText>
сервер создает
u003Cspan id="view:_id1:inputText1">u003C/span>
В 8.5.3 вы перейдете на все свойства на поле и добавили атрибут Readonly со значением True
Это создаст следующую разметку
<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 вы можете добавить атрибут Readonly в поле программно на событие OnclientLoad на странице, используя
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');