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

У меня есть элемент управления «Повторить», в котором есть поле редактирования, в котором передано значение по умолчанию. Для удаления этой строки есть кнопка «Удалить».

просто для теста я использовал вычисляемое поле вместе с полем редактирования. Вычисляемое поле также получает то же значение, что и поле редактирования. Теперь и вычисляемое поле, и поле редактирования имеют одинаковое значение. Когда я случайно нажимаю кнопку «Удалить», оно удаляется, но правильно вычисляемые поля обновляются только при контроле повторения, где бы они ни были удалены,

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

 <?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:this.data>
        <xp:dominoDocument var="document1" formName="testing">
        </xp:dominoDocument>
    </xp:this.data>
    <xp:inputText id="inputText1" multipleSeparator=",">
        <xp:this.defaultValue><![CDATA[#{javascript:var v:java.util.Vector = new java.util.Vector();
v.add('1');v.add('2');v.add('3');v.add('4');v.add('5');v.add('6');
return v;}]]></xp:this.defaultValue>
    </xp:inputText>
    <xp:br></xp:br>
    <xp:repeat id="repeat1" rows="30" var="r" indexVar="i" first="0">
        <xp:this.value><![CDATA[#{javascript:return getComponent("inputText1").getValue();}]]></xp:this.value>
        <xp:br></xp:br>
        <xp:div style="text-align:center">
            <xp:label value="#{javascript:r}" id="label1"
                style="text-align:center">
            </xp:label>
            <xp:button value="Delete" id="button1">
                <xp:eventHandler event="onclick" submit="true"
                    refreshMode="complete">
                    <xp:this.action><![CDATA[#{javascript:var v:java.util.Vector = getComponent("inputText1").getValue();
if(v != null){
var sdtString =  getComponent("inputText2").getValue();
if(v.contains(sdtString))
v.remove(sdtString);
};}]]></xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:inputText id="inputText2">
                <xp:this.defaultValue><![CDATA[#{javascript:getComponent("label1").getValue();}]]></xp:this.defaultValue>
            </xp:inputText>
        </xp:div>
        <xp:br></xp:br>
    </xp:repeat>
</xp:view>

Это пример кода для тестирования, чтобы точно определить проблему.

Редактировать 1: Реальный сценарий

У нас есть приложение для выбора нескольких дат для встречи, и, следовательно, используя свободное время для заметок, мы отмечаем несколько дат, а затем пользователям разрешается редактировать/удалять их в другом окне. Поскольку было невозможно/достаточно осуществимо сохранить все поля в SSJS, мы скорее предпочли привязать каждое поле к источнику данных под управлением повторения, используя настраиваемые свойства пользовательского элемента управления (надеюсь, я имею какой-то смысл). Каждое поле отображается, как указал @chintan, следующим образом:

dataSource[compositeData.to]

Как описано в первой части вопроса, поля не обновляются, поскольку мы устанавливаем для них значения по умолчанию. Однако, основываясь на предложении, мы попытались установить поле с помощью библиотеки сценариев, которая работает хорошо, однако может показаться глупой, но она искажает поле даты. Когда мы устанавливаем значение, используя следующее:

var d:java.util.Date = new java.util.Date(compositeData.selectedDate);
getComponent("from").setValue(d);

Он смешивает поля месяца, даты и года и показывает совершенно другое значение (тот же код хорошо работает, когда он используется в качестве значения по умолчанию).

Надеюсь, это имеет смысл.

Любое решение может быть оценено.


person Ajit Hogade    schedule 16.05.2015    source источник


Ответы (2)


defaultValue inputText2 выполняется только один раз при загрузке первой страницы. Затем XPage запомнил, что повтор 1 имеет inputText2 defaultValue 1, повтор 2 имеет inputText2 defaultValue 2 и так далее.

введите здесь описание изображения

Пример: как вы можете видеть в журнале печати, defaultValue inputText2 не вычисляется снова после удаления строки 3, а затем строки 1.

Переверните его и установите значение inputText2 в коде value label1:

        <xp:label
            value="#{javascript:getComponent('inputText2').setValue(r); r}"
            id="label1"
            style="text-align:center">
        </xp:label>

тогда он правильно установит значение inputText2. Вам больше не нужно свойство defaultValue inputText2.

В качестве альтернативы вы можете определить свойство value inputText2 и привязать его к источнику данных для конкретной строки или переменной viewScope.

person Knut Herrmann    schedule 16.05.2015
comment
Спасибо, это действительно решает проблему здесь, однако в реальном сценарии у нас есть несколько полей (точнее, раздел и 2 даты), вторая дата зависит от значения первой даты, и она сломается после первый повтор, поскольку он не будет обновляться ... альтернативным подходом было бы установить все с помощью скрытого поля, однако будет ли это хорошим подходом? - person Ajit Hogade; 16.05.2015
comment
Кроме того, что касается привязки, поля присутствуют в пользовательском элементе управления, который повторяется внутри элемента управления повторением, и все привязки устанавливаются с использованием пользовательских свойств, поэтому я полагаю, что альтернатива здесь не будет работать? Пожалуйста, поправьте меня, если я ошибаюсь.. - person Ajit Hogade; 16.05.2015
comment
Извините, позвольте мне тоже прервать вас, так как мы оба работаем над одним и тем же.. ну, во-первых, большое спасибо за все ответы.. привязка уже установлена ​​как составной источник данных. необходимо сохранить все значения в событии сохранения ... так что, насколько мне известно, мы не сможем следовать последнему предложению, верно? Пожалуйста, поправьте меня, если я ошибаюсь.. - person Chintan Parekh; 16.05.2015
comment
Извините, мне пришлось откатить мое предложение пользовательского элемента управления, так как это не имеет смысла для этого примера, поскольку вам потребуется доступ к значению inputText2 пользовательского элемента управления в кнопке удаления. Я чувствую, что ваш тестовый пример слишком упрощает ваш реальный код. Какой тип источника данных вы определили и каковы на самом деле повторяющиеся значения? Многозначные поля? Документы? - person Knut Herrmann; 16.05.2015
comment
Что ж, функция удаления, похоже, работает правильно. Мы нашли способ обойти это. Мы динамически получаем значение в итераторе, используя переменную индекса для извлечения значения из вектора, который повторяется. поделиться кодом здесь ... поскольку даже если я поделюсь, большинство полей зависят от документа настроек и просто рухнут на вашей стороне ... просто отредактируйте вопрос с объяснением реального сценария ... - person Chintan Parekh; 16.05.2015
comment
Мы сделали это таким образом, и это сделано! Извините за поздний ответ. Даже оба решения полезны. - person Ajit Hogade; 19.05.2015

Как вы описали в своем «Редактировании 1 реального сценария», вы хотите редактировать и удалять пары дат. Я создал следующий пример. Вместо дат я просто использую строки для простоты. Сохраняйте даты в переменной viewScope и редактируйте/удаляйте их прямо там:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.dates=[
    {"from":"a", "to":"b"},
    {"from":"c", "to":"d"},
    {"from":"x", "to":"y"}];}]]></xp:this.beforePageLoad>
    <xp:br />
    <xp:repeat
        id="repeat1"
        rows="30"
        var="r"
        indexVar="i"
        value="#{viewScope.dates}">
        <xp:br></xp:br>
        <xp:div>
            <xp:button
                value="Delete"
                id="button1">
                <xp:eventHandler
                    event="onclick"
                    submit="true"
                    refreshMode="complete">
                    <xp:this.action><![CDATA[#{javascript: viewScope.dates.remove(i);
                    }]]></xp:this.action>
                </xp:eventHandler>
            </xp:button>
            <xp:inputText
                id="inputText1"
                value="#{r.from}">
            </xp:inputText>
            <xp:inputText
                id="inputText2"
                value="#{r.to}">
            </xp:inputText>
            <xp:button
                value="Update"
                id="button2">
                <xp:eventHandler
                    event="onclick"
                    submit="true"
                    refreshMode="complete">
                    <xp:this.action><![CDATA[#{javascript: "";
                    }]]></xp:this.action>
                </xp:eventHandler>
            </xp:button>
        </xp:div>
        <xp:br></xp:br>
    </xp:repeat>
    <xp:text
        escape="false"
        id="computedField1">
        <xp:this.value><![CDATA[#{javascript:
            var length = viewScope.dates.length;
            var result = "";
            for (var i = 0; i < length; i++) {
                result += viewScope.dates[i].from + " - " + viewScope.dates[i].to + "<br />";
            }
            result
        }]]></xp:this.value>
    </xp:text>
</xp:view>

Создайте переменную viewScope как массив объектов.

person Knut Herrmann    schedule 16.05.2015