2014-09-02 3 views
1

У меня есть простой документ с 3 полями и 1 текстовое поле. У меня также есть xpage с тремя простыми элементами управления полем и одним богатым текстом. Имя моего документа NotesXSPDocument - document1.Могу ли я получить все компоненты документа xsp в xpages?

Вопрос 1: Могу ли я получить вектор со всеми элементами управления документа xsp? например, вместо использования getComponent("fld1"), getComponent("fld2") ... и т. д., могу ли я использовать что-то вроде getAllComponents() или document1.getControls()? Конечно, таких методов не существует, поэтому я спрашиваю, есть ли способ сделать это. Я знаю, что могу получить все элементы документа (а не XSP), вызвав document1.getDocument().getItems(). Есть ли что-то подобное для xsp?

Вопрос2: Допустим, мы можем получить вектор, как описано выше. Затем, если i итерации через этот вектор, чтобы получить значение каждого элемента управления, существует ли способ проверить, является ли он богатым текстом или просто текстовым полем?

+0

Мне просто интересно, почему вы хотите получить все компоненты на Xpage? Для чего это нужно/использовать? Я вижу редкую потребность в getItems в документе, но я не понимаю, зачем вам нужны все компоненты на Xpage. –

+0

Я создал модуль, который работает как «auto save as draft» gmail. Поэтому, когда я открываю документ для редактирования, я периодически проверяю, есть ли какие-либо изменения в полях. Я реализовал его, получив поля один за другим, но я хочу сделать его более абстрактным и многоразовым. –

+0

Возможно, вам будет лучше проверять клиентскую сторону разницы полей, а затем запускать сохранение на стороне сервера, тем более, что вы хотите «периодически» опроса об изменениях. –

ответ

3

Немного сложный, но да. facesContext.getViewRoot() - объект UIViewRoot, поэтому он имеет метод List<UIComponent> getChildren(), который возвращает его дочерние элементы.

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

Для типов вы можете решить, какой тип компонента принадлежит его классу. Например, UIInput является текстовым полем и т. Д.

4

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

Тем не менее, если вы хотите получить список входов на странице, XspQuery является вашим другом: http://avatar.red-pill.mobi/tim/blog.nsf/d6plinks/TTRY-96R5ZT. При этом вы можете использовать «locateInputs», чтобы получить список всех входных данных на странице, а затем проверить их привязки метода значений, чтобы увидеть, ссылается ли строка на имя вашей переменной. Произошла ошибка и не очень красивая, но она сработает. Поскольку они привязываются к свойствам, я не думаю, что фильтр startsWith там будет делать то, что вы хотите.

В качестве альтернативы вы можете с самого начала привязать компоненты к чему-то в классе Java. Недавно я делал то же самое (для другого конца) и изначально описывал его здесь: https://frostillic.us/f.nsf/posts/my-black-magic-for-the-day. Результатом является то, что с правильной умностью для того, как вы выполняете свойство binding = "", вы можете получить список всех компонентов, которые ссылаются на свойство данного объекта.

Что касается второй части вопроса, если у вас есть дескриптор компонентов так или иначе, вы можете проверить, не является ли это богатым текстовым элементом, выполнив «компонент instanceof com.ibm.xsp.UIInputRichText ».

Смежные вопросы