Решено Формулы скрытия и datasource

motogarri

Well-Known Member
17.02.2010
200
4
#1
Привет. Помогите плс разобаться.
На странице имеется датасорс и панель с несколькими репит-контролами. Репиты отображают наборы полей из документа, типа:
FirstName_1, LastName_1, MiddleName_1
FirstName_2, LastName_2, MiddleName_2
. . . . . . . . . . .
FirstName_15, LastName_15, MiddleName_15

В документе нет поля, которое показало бы сколько имён присутствует в таблице, значит нужно вычислять самому
JavaScript:
var n = 0;
for (var i = 1; i <= 16; i++) {
	if(datasource1.hasItem("FirstName_" + i) || datasource1.hasItem("LastName_" + i) || datasource1.hasItem("MiddleName_" + i)){
		var fname = datasource1.getItemValueString("FirstName_" + i);
		var lname = datasource1.getItemValueString("LastName_" + i);
		var mname = datasource1.getItemValueString("MiddleName_" + i);
		if(lname + fname + mname != "") n += 1;
	}
}
return n;
Получается этот цикл нужно выполнять на вычислении количества строк репита и в формуле скрытия таблицы в которую помещён репит.

Наверняка же можно вычислить количество строк только один раз на каком-нибудь событии датасорса и передать через viewScope? Только вот на какое бы событие датасорса я бы ни вешал вычисление, либо 'datasource1' not found, либо страница уже прорисовалась и скрытие не сработало.
 
Последнее редактирование модератором:

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#2
у репитера есть метод getRowCount()
А вопрос отсеивания пустых записей решается на уровне datasource

А чтоб подсказать куда надо вешать обработку - нужно знать цель задачи.
 

motogarri

Well-Known Member
17.02.2010
200
4
#3
Цель - отобразить xp:table в которой есть репит-контрол. То-есть мне надо скрывать всю таблицу, если репит пустой. Если на таблице вычислять условие скрытия вот так: getComponent("repeat1").getRowCount() > 0 ? true : false , то получается 'getComponent()' is null. Хотя поле в ячейке таблицы отображает количество строк в репите верно.
 

motogarri

Well-Known Member
17.02.2010
200
4
#4
Наверное потому что репит дочерний элемент по отношению к таблице, не знаю. Потому хотел сначала посчитать количество строк в датасорсе и передать его в репит.
 

motogarri

Well-Known Member
17.02.2010
200
4
#5
Таблицу я использую для заголовков к данным в репите. Может я вообще не так делаю? Может как-то по другому можно?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#6

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#7
Ну как вариант - можно получить коллекцию по виду и посмотреть сколько строк в результате
 

motogarri

Well-Known Member
17.02.2010
200
4
#8
Всё, допёрло до меня. Там оказывается можно вот такую штуку вставить:
HTML:
<xp:this.facets>
	<xp:text disableTheme="true" xp:key="header" escape="false">
		Таблица с заголовками
	</xp:text>
</xp:this.facets>
Тогда таблица станет дочерней к репит-контролу и все будет нормально скрываться:
HTML:
<xp:this.rendered><![CDATA[${javascript:
	this.getRowCount() > 1 ? true : false}]]>
</xp:this.rendered>
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#9
Всё, допёрло до меня. Там оказывается можно вот такую штуку вставить:
HTML:
<xp:this.facets>
	<xp:text disableTheme="true" xp:key="header" escape="false">
		Таблица с заголовками
	</xp:text>
</xp:this.facets>
Тогда таблица станет дочерней к репит-контролу и все будет нормально скрываться:
HTML:
<xp:this.rendered><![CDATA[${javascript:
	this.getRowCount() > 1 ? true : false}]]>
</xp:this.rendered>
не понял.... ты в репитер вставил таблицу?
 

motogarri

Well-Known Member
17.02.2010
200
4
#11
HTML:
<xp:repeat id="repeat3" first="1" indexVar="index" style="margin-top:5px">
	<xp:this.facets>
		<xp:text disableTheme="true" xp:key="header" escape="false">
			<xp:table style="width:100%">
				<xp:tr>
					<xp:td style="color:rgb(0,0,128);font-weight:bold">
						Заголовок
					</xp:td>
				</xp:tr>
			</xp:table>
		</xp:text>
</xp:this.facets>
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#12
Немного не правильно. Это в каждой строке репитера будет рисоваться таблица.
И будут проблемы с изменением ширины столбцов. В разных строках репитера ширина одного и того же столбца может отличаться.
Лучше сделать так

HTML:
 <xp:table>
	<xp:tr>
		<xp:td>Заголовок1</xp:td>
		<xp:td>Заголовок2</xp:td>
	</xp:tr>
	<xp:repeat id="repeat1" rows="30" value="#{view1}">
		<xp:tr>
			<xp:td></xp:td>
			<xp:td></xp:td>
		</xp:tr>
	</xp:repeat>
</xp:table>
 
Последнее редактирование модератором: