Помещение результатов из средства выбора имени в элемент управления только для чтения

Я использую средство выбора имен из библиотеки расширений в XPages и помещаю результаты в многострочное поле редактирования.

Как сделать поле редактирования доступным только для чтения, чтобы конечный пользователь не мог редактировать выбранные имена, кроме как с помощью средства выбора имен?

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

Я также попытался поместить результаты в скрытое поле, а затем отобразить результаты в вычисляемом поле, используя перевод строки в качестве разделителя, но скрытие целевого элемента управления также делает невидимым элемент управления.


person Bill F    schedule 14.02.2013    source источник


Ответы (5)


Вы можете комбинировать namePicker с элементом управления djextNameTextBox из библиотеки расширений. Этот элемент управления позволяет пользователю только удалить имя (но не редактировать его).

<xe:djextNameTextBox id="testField" value="#{document.TestField}"></xe:djextNameTextBox>
<xe:namePicker id="namePicker1" for="testField" dialogTitle="Pick a name">
    <xe:this.dataProvider>
        <xe:dominoNABNamePicker addressBookSel="all-public" nameList="people"></xe:dominoNABNamePicker>
    </xe:this.dataProvider>
</xe:namePicker>

Я понимаю, хотите ли вы использовать поле редактирования вместо djextNameTextBox из-за того, как оно выглядит. Если это так, то немного пользовательского CSS, вероятно, может вам помочь :-)

person Per Henrik Lausten    schedule 14.02.2013
comment
У меня была та же проблема, что и у Билла. Спасибо за подсказку, но, к сожалению, диалоговое окно выбора имени не закрывается после нажатия на кнопку "ОК". Я понял, что поведение средства выбора имени зависит от того, какая цель была задана для отображения выбранных имен. Есть идеи? - person CarpeTempus_; 28.01.2014

Используйте свойство maxlength. Это не позволит людям вводить текст в поле напрямую.

<xp:inputText id="inputText1"
value="#{viewScope.adminOwner_Tx}" maxlength="0"
style="width:300px">
</xp:inputText>
person Sean Cull    schedule 29.03.2013

Я использую обходной путь, используя скрытое поле <xp:hidden> и вычисляемое поле. Я описал это в своем блоге http://naveegator.blogspot.com/2012/06/displaying-common-names-of-user-with.html.

Ниже приведен фрагмент кода:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xe:namePicker id="npUserNames" for="hdnUserNames">
        <xe:this.dataProvider>
            <xe:dominoNABNamePicker addressBookDb="names.nsf"></xe:dominoNABNamePicker>
        </xe:this.dataProvider>
    </xe:namePicker>
    <xp:inputHidden id="hdnUserNames" multipleTrim="true">
        <xp:this.multipleSeparator><![CDATA[#{javascript:","}]]></xp:this.multipleSeparator>
        <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="cfUserNames"></xp:eventHandler>
    </xp:inputHidden>
    <xp:text escape="true" id="cfUserNames">
        <xp:this.value><![CDATA[#{javascript:@Name("[CN]", getComponent("hdnUserNames").getValue())}]]></xp:this.value>
    </xp:text>
</xp:view>

Вы также можете посмотреть ответ Свена на этот вопрос "поле ReadOnly в Xpage не отправлено" о том, как сделать поля только для чтения.

person Naveen    schedule 14.02.2013

Спасибо за ответы. Я использовал несколько ответов здесь и на форуме XPages Lotus.

  1. Я создал средство выбора имен додзё и указал его на текстовый элемент управления под названием «Утверждающие» и установил для MultipleSeparator значение «,» в элементе управления утверждающих.
  2. Добавьте многострочное текстовое поле, которое я назвал ApproversDisplay, установите его только для чтения и не привязывайте его к объекту данных и значению по умолчанию

    var Rel = getComponent('Approvers').getValue();
    return @Implode(Rel,"\n")
    

    который отделяет каждое значение новой строкой.

  3. Установите событие onchange в элементе управления Approvers, чтобы выполнить частичное обновление ApproverDisplay.
  4. в источнике я устанавливаю свойство стиля display:none, это не скрывает средство выбора имени, как это делает свойство visible.

Я новичок в XPages, поэтому некоторые могут подумать, что есть лучший способ, но после большего количества часов, чем я действительно хочу считать! Это работает!

person Bill F    schedule 17.02.2013

Обходной путь для этих случаев, который я обычно использую, похож на Билла Ф. и Навина (но, возможно, немного чище):
заключите целевое поле средства выбора в div и скройте его, применив «display: none» в качестве стиля. . Таким образом, он отображается на странице, что делает его доступным, но невидимым.
Для отображения любых изменений, внесенных средством выбора в это поле, я добавляю событие onchange, обновляющее панель, содержащую вычисляемое поле. Кроме того, вы можете стилизовать отображение имен в вычисляемом поле по своему усмотрению (два примера в коде).

<xp:div style="display:none;">
    <xp:inputText id="yourfield" value="#{yourdocument.yourfield}" multipleSeparator=";">
        <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="surroundingpanel"></xp:eventHandler>
    </xp:inputText>
</xp:div>

<xp:panel id="surroundingpanel">

    <!-- displaying names abbreviated, separated by default multi-separator , -->
    <xp:text escape="true" id="computedFieldExample1" value="#{yourdocument.yourfield}">
        <xp:this.converter> <!-- converter is optional -->
            <xp:customConverter>
                <xp:this.getAsString><![CDATA[#{javascript:@Name("[ABBREVIATE]", value)}]]></xp:this.getAsString>
                <xp:this.getAsObject><![CDATA[#{javascript:@Name("[CANONICALIZE]", value)}]]></xp:this.getAsObject>
            </xp:customConverter>
        </xp:this.converter>
    </xp:text>

    <!-- displaying names abbreviated one below each other -->
    <xp:text escape="false" id="computedFieldExample2">
        <xp:this.value><![CDATA[#{javascript:@Implode(@Name("[ABBREVIATE]", yourdocument.getItemValue("yourfield")), "<br />")}]]></xp:this.value>
    </xp:text>

    <xe:namePicker id="namepicker1" for="yourfield">
        <xe:this.dataProvider>
            <xe:dominoNABNamePicker nameList="peopleByLastName"></xe:dominoNABNamePicker>
        </xe:this.dataProvider>
    </xe:namePicker>
</xp:panel>
person DonMaro    schedule 29.04.2015