Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
Есть xp:repeat который отображает несколько строк с документами. Каждая строка содержит некий компонент (например xe:dialog).
Вопрос - как в SSJS развернуть диалог находящемуся на N-ой строчке репита?
Как вообще можно получить доступ к компоненту на определённой строке?
Есть рипит контрол - отображает данные из представления. В каждой строчке рипита так же есть: поле (Input Box) и Кнопка. По клику на Кнопку надо брать данные из инпут бокса (соответствующего данной строчке рипита) - туда данные вводят вручную, и обрабатывать их на сервере. Так вот как это можно сделать?
Пробовал по такому сценарию:
Ссылка скрыта от гостей
. Не подходит - инпут поля в рипите множатся, но алиас у них один Введенные данные на сервере берутся некорректно.
Пробовал так же в Data Source Инпут поля прописывать ['Alias' + rowIndex] через Scope переменную, где rowIndex - Index name в Рипит контроле. Выдается ошибка
com.sun.faces.el.impl.ElException: An exception occured trying to convert String "Alias" to type "java.lang.Long"
An exception occured trying to convert String "Alias" to type "java.lang.Long"
P.S. Есть ли вообще такая техническая возможность при помощи обычного рипит контрола? Или стоит копать в пользу готовых контролов - например Dojo Data Grid?
можно сделать немного по другому.
Можно использовать один диалог для всех документов. Причем диалог грузить динамически и передавать в него документ.
Вызывать диалог, например, по клику на строку документа или по кнопке в репитконтроле
можно сделать немного по другому.
Можно использовать один диалог для всех документов. Причем диалог грузить динамически и передавать в него документ.
Вызывать диалог, например, по клику на строку документа или по кнопке в репитконтроле
А можно чуть поподробнее?
Т.е. при клике на док в рипит контроле открывается всплывающее окно (диалог бокс) с Интпут боксом куда вводятся необходимые данные? и дальше, после закрытия всплывающего окна, данные обрабатываются на сервере?
А можно чуть поподробнее?
Т.е. при клике на док в рипит контроле открывается всплывающее окно (диалог бокс) с Интпут боксом куда вводятся необходимые данные? и дальше, после закрытия всплывающего окна, данные обрабатываются на сервере?
Есть функция динамической загрузки кастом-контролов
JavaScript:
function loadCC( Name: String, parent: String, index, delChildren: boolean ){
//get panel control as parent of the custom control to include
//var objParent = getComponent( "panel_0" );
var objParent = getComponent( parent );
if( delChildren == true ){
if (objParent.getChildren().size() > 0) {
objParent.getChildren().clear();
}
}
//page name of the custom control to include
var strPageName = "/" + Name;
//create new UIIncludeComposite
var objControl = new com.ibm.xsp.component.UIIncludeComposite();
//set the page name to the UIIncludeComposite object
objControl.setPageName(strPageName);
//Ensure a unique id for this control
objControl.setId( "i_"+ index );
//objControl.setId( index );
//Create a builder object from XPages Extension Library
var objBuilder = new com.ibm.xsp.extlib.builder.ControlBuilder();
//to use the builder you need ControlImpl objects.
//Because this builder only can work with those objects
//get the class of ControlImpl
var classControlImpl = objBuilder.getClass().getDeclaredClasses()[1];
//create an ControlImpl object of the parent panel
var objImplParent = new classControlImpl(objParent);
//create an ControlImpl object of the custom control
var objImplControl = new classControlImpl(objControl);
//add the new custom control to the parent
objImplParent.addChild(objImplControl);
//build the updated parent control
objBuilder.buildControl(facesContext,objImplParent,false);
}
На входе имя кастом-котрола. Например Name = "cc_test.xsp". Расширение в коде обязательно! Хотя в списке дизайнера указывается только имя! index - имя, которое присвоится кастом-контролу . После загрузки к этому имени допишется префикс "i_" parent - имя контрола, в который будем добавлять свой кастом-контрол.
Я для этого добавляю в конец страницы пустую панель. В ней не жалко удалять не нужные объекты по delChildren.
Если у кастом-контрола есть Property Definition - берем свойства и присваиваем то что надо. Типы данных обязательно соблюдаем.
Передать можно строки, числа, объекты. Подробнее
Ссылка скрыта от гостей
или
Ссылка скрыта от гостей
Вот пример как передать юнид документа в кастом-контрол. При условии что в кастом-контроле есть уже объект документа. В самом же кастом-контроле параметр берется через compositeData
Если надо передать именно объект документа в кастом-контрол:
JavaScript:
var cmp:com.ibm.xsp.component.UIIncludeComposite = getComponent( "i_" + ndex );
cmp.getPropertyMap().setProperty("document", document1);
Соответственно все работы в кастом-контроле ведутся через compositeData.
Если же кастом-контрол является частью одного документа - в кастом-контроле не нужны никакие объекты документа.
В свойствах Data Binding контрола в кастом-контроле можно просто написать Data source и Bind to объект основной страницы
Чтоб открыть диалог - все как всегда при помощи SSJS или CSJS
JavaScript:
var d = getComponent( "dialog1" );
d.show()
Для пущего феншуя в кастом-контрол с диалогом добавляю параметры для рефреша компонентов после закрытия диалога и так же передаю код, который может выполняться по кнопке Ok в диалоге
Таким методом можно создавать динамические страницы. Определять кастом-контролы до загрузки страницы.
Этим методом разношу логику. В дизайнере работать удобно. Страницы получаются практически пустые.
Поддерживаю технологию, которую описал NickProstoNick. Сам дизайню так-же.
Работать очень удобно и вся логика абсолютно прозрачна. Особенно для тех, кто только пришёл в xpages из классического клиента.
У новичков всегда возникает вопрос: как в хепагах дизайнить фреймы?
Вот так - с помощью loadCC (у меня ещё replaceCC) грузить кастом-контролы или задизайненные страницы(!) (тут надо быть внимательным - не каждая хепага загрузится без ошибок!) в нужные места предварительно размеченной главной страницы (дивами, панелями, таблицей... кому что нравится).
Т.е. это эквивалент связки SetTargetFrame & OpenPage(Form...) в классике.
Результат - полностью динамичная страница.
Часто всё WEB приложение обходится ей одной (если не нужен функционал с параллельной логикой в двух и более вкладках браузера).
Делаете имя Вашего контрола, который размножаете в репитере, вычисляемым - например Name: MyControl_${rptIndex}, где rptIndex - это Index Name репитера (Options).
Name (id) контрола в Properties дизайнер поправить не даст - надо править в коде (Sourse).
Далее, как обычно, получаете компонент по id: getComponent('MyControl_' + i), где i - индекс компонента в строке (или колонке) репитера.
Делаете имя Вашего контрола, который размножаете в репитере, вычисляемым - например Name: MyControl_${rptIndex}, где rptIndex - это Index Name репитера (Options).
Name (id) контрола в Properties дизайнер поправить не даст - надо править в коде (Sourse).
Далее, как обычно, получаете компонент по id: getComponent('MyControl_' + i), где i - индекс компонента в строке (или колонке) репитера.
Можно, если не сложно, пример.
При прописывании в атрибуте id - MyControl_${rptIndex} в теге xp:inputText - в итоговой html странице элементы inputText имеют id-шники MyControl_.
То, что значение id у элемента (в данном случае это InputBox) - всегда статично, т.е. насколько я понял (ссудя из ссылки хелпа выше) вычислять его нельзя - можно только "намертво вбить". Или я чего то не понял/не знаю и прошу рассказать как можно это id - вычислять.
Делаете имя Вашего контрола, который размножаете в репитере, вычисляемым - например Name: MyControl_${rptIndex}, где rptIndex - это Index Name репитера (Options).
Name (id) контрола в Properties дизайнер поправить не даст - надо править в коде (Sourse).
Далее, как обычно, получаете компонент по id: getComponent('MyControl_' + i), где i - индекс компонента в строке (или колонке) репитера.
P.S. Если в поле прописать id="MyControl_${rptIndex}", где rptIndex - indexVar (оно же Index name). то в итоговой html-странице все поля в репит контроле получаются с id: MyControl_.
Все остальное (из вашей инструкции - уже сделано)
Всем привет. Пытаюсь реализовать похожую конструкцию у себя, а флаг repeatControls портит всю малину...
Кто может подсказать, для чего конкретно он нужен? Хэлп говорит что он типа либо создаст один контрол, либо набор, на каждую итерацию и я не понимаю, что бы это значило...
А вообще у меня проблема вот в чем: хочу сделать вычисляемый id div'ов в репитере, как в примере. Пока у репитера value обычный массив(var arr = ['aa','bb'] например) repeatControls="true" не влияет на отображение.
Как только value становится NotesDocumentCollection - все, div репитера на странице отсутствует. И никаких ошибок/месседжей...
Всем привет. Пытаюсь реализовать похожую конструкцию у себя, а флаг repeatControls портит всю малину...
Кто может подсказать, для чего конкретно он нужен? Хэлп говорит что он типа либо создаст один контрол, либо набор, на каждую итерацию и я не понимаю, что бы это значило...
А вообще у меня проблема вот в чем: хочу сделать вычисляемый id div'ов в репитере, как в примере. Пока у репитера value обычный массив(var arr = ['aa','bb'] например) repeatControls="true" не влияет на отображение.
Как только value становится NotesDocumentCollection - все, div репитера на странице отсутствует. И никаких ошибок/месседжей...
Вообще проблема шире. На страницу добавлен репитер. Датасорс для него - NotesViewEntryCollection доков из другой базы(конструкция типа embedded view). На форме есть кнопка, которая позволяет редактировать поля этих отображаемых доков и сохранять изменения(за пределами репитера, но внутри panel). Весь репитер с кнопкой обернут в Panel с заданным датасорс dominoView, на который завязан репитер. Мне нужно кодом из другой кнопки(общая "Сохранить" для всего дока), находящейся за пределами panel либо получить xsp документ каждого дока внутри репитера и сохранить его(со всеми изменениями), либо получить введенные значения и сложить их в целевые документы в бэке.
Либо где-то глобально хранить эту коллекцию в java объекте например... или еще где.
На данном сайте используются cookie-файлы, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших cookie-файлов.