Как изменить режим Editbox из режима чтения в режим редактирования в Xpage? - PullRequest
1 голос
/ 17 февраля 2012

На самом деле я установил 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>

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

После дальнейшего рассмотрения эта проблема не имеет ничего общего с самим полем: код, включенный в вопрос, соответствует желаемому ответу.Скорее проблема в том, что событие определено внутри dijit.Dialog.

Когда Dojo анализирует диалог, он перемещает элементы DOM в конец тела по причинам компоновки.К сожалению, это также перемещает его за пределы формы.Это нарушает любые события на стороне сервера, потому что данные события больше не сериализуются как часть формы.Таким образом, в вашем примере событие завершается неудачей не потому, что код события неправильный, а потому, что само событие никогда не запускается.

Идеальным решением для этого является использование компонента диалога из библиотеки расширений (или 8.5.3 UP1) вместо промежуточного элемента div с указанным типом dojoType.Если это не вариант, есть обходной путь ... добавьте следующий компонент внизу страницы:

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

Это должно привести к тому, что все проанализированные диалоги будут перемещены обратно в форму, разрешив событиявнутри них снова правильно стрелять.

1 голос
/ 18 февраля 2012

Если вы хотите сделать это на стороне сервера, вот пример кнопки, которая переключает режим чтения / редактирования:

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

Посмотрите на этот сайт , чтобы увидетьвсе свойства для всех компонентов, с которыми вы можете взаимодействовать через SSJS.

0 голосов
/ 17 февраля 2012

Создавая поле с помощью </ xp: inputText>

сервер создает тег

В 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: чтение}"). RemoveAttribute ( 'ReadOnly'); * * 1 022
...